我很难理解这句话。有人能给我解释一下如何追踪或告诉我为什么得到返回结果的操作顺序吗。
SELECT snumber
FROM table1
WHERE NOT EXISTS(
SELECT *
FROM table2
WHERE NOT EXISTS(
SELECT *
FROM table3
WHERE table1.snumber = table3.snumber
AND table2.pnumber = table3.pnumber));
table1 table2 table3
snumber pnumber snumber pnumber
s1 p1 s1 p1
s2 p2 s1 p2
s3 p3 s1 p3
s4 s2 p1
s5 s2 p32
s3 p1
s3 p2
s4 p1
s4 p2
s5 p1
结果只返回s1,我没有跟踪它。到目前为止,这是我的思考过程。底层子查询返回false。这会导致中级子查询不选择任何内容。因为那里什么都没有,所以最高层是真实的。这将导致顶层选择表1中的所有内容。
我到处都找过这样的例子,但似乎什么也找不到。我真的很感激所有的帮助。
1条答案
按热度按时间5hcedyr01#
基本上,查询是在
table1
其中不存在值table2
其中table1.snumber
以及table2.pnumber
不存在于table3
. 所以,基本上它需要所有的价值观table1
在那里有一排table3
哪个配对snumber
每pnumber
在table2
.另一种可能更容易理解的编写查询的方法是使用
JOIN
并计算输出中的行数。这个HAVING
子句检查给定snumber
在JOIN
结果与中的总行数相同table2
,即存在一个条目table3
每一个组合snumber
以及pnumber
中的值table2
:输出(对于两个查询)
sqlfiddle演示