当表已经加入 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
)
我有 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
)