MySQL WHERE EXISTS对所有记录的评估为true

时间:2014-09-26 02:35:31

标签: mysql sql subquery where exists

我试图运行一个查询来检索子查询中存在的表中的所有记录。

然而,它正在返回所有我想要的记录。

以下是查询:

SELECT DISTINCT x FROM T1 WHERE EXISTS 
      (SELECT * FROM T1 NATURAL JOIN T2 WHERE T2.y >= 3.0);

我尝试过测试子查询,并返回符合我约束条件的正确记录数。

但是当我运行整个查询时,它会返回子查询中不应存在的记录。

为什么EXISTS对T1中的所有记录都评估为真?

4 个答案:

答案 0 :(得分:2)

您需要一个相关的子查询,而不是子查询中的连接。目前还不清楚正确的相关条款是什么,但是类似的东西:

SELECT DISTINCT x
FROM T1
WHERE EXISTS (SELECT 1 FROM T2 WHERE T2.COL = T1.COL AND T2.y >= 3.0);

您的查询有一个常规子查询。每当它返回至少一行时,exists为真。因此,必须至少有一个匹配的行。这个版本"逻辑上"为外部T1中的每一行运行子查询。

答案 1 :(得分:1)

问:为什么EXISTS对T1中的所有记录评估为真?

A:因为子查询返回一行,完全独立于外部查询中的任何内容。

EXISTS谓词只是检查子查询是否返回一行,并返回一个布尔值为TRUE或FALSE。

您可以获得相同的结果:

SELECT DISTINCT x FROM T1 WHERE EXISTS (SELECT 1)

(唯一的区别是如果子查询没有返回至少一行,那么你就不会在外部查询中返回任何行。)

子查询返回的行与外部查询中的行之间没有相关性。


我希望你能提出另一个问题。对此的答案实际上取决于您想要返回的结果集。

如果你想从T1返回有一些"匹配" T2中的一行,您可以使用NOT EXISTS (correlated subquery)

或者,您也可以使用连接操作返回等效结果,例如:

 SELECT DISTINCT T1.x 
   FROM T1
NATURAL
   JOIN T2 
  WHERE T2.y >= 3.0

答案 2 :(得分:0)

它不起作用,因为外部查询和正在使用的子查询之间没有相关性。下面是and T1.id = T2.id

形式的相关性
SELECT DISTINCT x 
FROM T1 
WHERE EXISTS  ( SELECT 1 FROM T2 WHERE T2.y >= 3.0 and T1.id = T2.id)
;

但是,在不知道数据的情况下,我希望您不需要使用" distinct"在该查询中,这将产生相同的结果:

SELECT x 
FROM T1 
WHERE EXISTS  ( SELECT 1 FROM T2 WHERE T2.y >= 3.0 and T1.id = T2.id)
;

另一种可能需要不同的替代方案是第二次查询后半部分的变体

SELECT DISTINCT x FROM T1 NATURAL JOIN T2 WHERE T2.y >= 3.0

答案 3 :(得分:0)

您可以使用INNER JOIN来到达您尝试去的地方:

SELECT DISTINCT T1.X
  FROM T1
  INNER JOIN T2
    ON T2.COL = T1.COL
  WHERE T2.Y > 3.0

分享并享受。