当表已经加入 SQL 时,我们可以避免嵌套查询吗?

Can we avoid nested queries when tables are already joined in SQL?

我有 2 个这样的 table,主要实体和一个代表实体的状态,包括旧实体。

> entity
id, current_status_id

> status
id, entity_id, name

我写了一个这样的查询,return 当前具有给定状态的实体项目

SELECT e.* 
FROM entity e
INNER JOIN status s ON e.current_status_id = s.id
WHERE name = $some_status

但是假设我想向该查询添加一个筛选器,该筛选器已经在状态和实体之间进行了连接。例如:如果它过去有另一个状态。所以"select items with a given status that had another status in the past"

我会将其添加到上一个查询的末尾:

AND e.id IN (SELECT entity_id FROM status WHERE name = $another_status)

我想知道在这种情况下是否有必要嵌套查询,因为这个 table 已经加入了。有没有捷径或好的做法?

谢谢

您可以在 ON 子句中设置多个条件

SELECT e.* 
FROM entity e
INNER JOIN status s
  ON e.current_status_id = s.id
  AND s.name IN ('$some_status', '$another_status')

但它的工作方式应该与在 where 子句中使用的方式完全相同

SELECT * 
FROM entity e, status s
WHERE e.current_status_id = s.id
AND s.name IN ('$some_status', '$another_status')

您可以使用相同的 table 使用别名

SELECT e.* 
FROM entity e
INNER JOIN status s1 ON e.current_status_id = s1.id  
    and  s1.name = $some_status
INNER JOIN status s2 ON e.current_status_id = s2.id  
    and  s2.name = $another_status

您必须使用子查询或多一个连接,因为您试图获得 status table

的两个独立子集
SELECT e.* 
FROM entity e
INNER JOIN status s ON e.current_status_id = s.id
WHERE name = $some_status
    AND EXISTS (
        SELECT 1
        FROM status
        WHERE name = $another_status
        AND entity_id = e.id
)