我有2张桌子
此查询:
SELECT *
FROM t1
WHERE EXISTS (SELECT 1 FROM t1 WHERE t1.col >= 2)
从t1
返回两行,这没关系,因为EXISTS
至少返回一行,所以where子句变为TRUE。
现在是第二个查询
SELECT *
FROM t1
WHERE EXISTS (SELECT 1 FROM t2 WHERE t1.col = t2.col)
这只返回1行。为什么?在这种情况下EXISTS
也会返回至少一行,那么为什么不从“t1”表返回所有行?
EXISTS()
功能如何真正起作用?
答案 0 :(得分:2)
在您的第一个查询中,exists()
内没有对外部表的引用,并且由于该查询的计算结果为true,因此查询将变为
select * from t1 where 1 = 1 ;
您的第二个查询确实引用了exists()
中的外部表,并针对t1.col
的每个值进行了评估。因此,对于t1.col = 1
exists()
true
返回t1.col = 2
的行,当exists()
时,t1.col = 1
返回false。因此,您的结果集只包含{{1}}的行。
答案 1 :(得分:0)
如果EXISTS找到一条或多条记录,则返回true。 由于列t1的值为1和2,t2的值为1。
这个
SELECT *
FROM t1
WHERE EXISTS (SELECT 1 FROM t2 WHERE t1.col = t2.col)
现在意味着
SELECT *
FROM t1
WHERE EXISTS (SELECT 1 FROM t2 WHERE 1 = 1)
所以你只得到1行而不是2行。