我试图运行一个查询来检索子查询中存在的表中的所有记录。
然而,它正在返回所有我想要的记录。
以下是查询:
SELECT DISTINCT x FROM T1 WHERE EXISTS
(SELECT * FROM T1 NATURAL JOIN T2 WHERE T2.y >= 3.0);
我尝试过测试子查询,并返回符合我约束条件的正确记录数。
但是当我运行整个查询时,它会返回子查询中不应存在的记录。
为什么EXISTS对T1中的所有记录都评估为真?
答案 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
分享并享受。