当表已经在SQL中联接时,我们可以避免嵌套查询吗?

时间:2019-06-06 13:41:02

标签: mysql sql nested-query

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

> entity
id, current_status_id

> status
id, entity_id, name

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

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

但是,让我们说我想向此查询添加一个过滤器,该过滤器已经在Status和Entity之间建立了连接。例如:过去是否具有其他状态。因此,“选择具有给定状态且过去具有其他状态的项目”

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

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

我想知道在这种情况下是否有必要嵌套查询,因为该表已被连接。是否有捷径或良好做法?

谢谢

3 个答案:

答案 0 :(得分:1)

您必须使用子查询或一个以上的联接,因为您尝试获取status表的两个独立子集

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
)

答案 1 :(得分:0)

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')

答案 2 :(得分:0)

您可以使用别名使用同一表

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