不存在多个sql

eaf3rand  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(409)

我很难理解这句话。有人能给我解释一下如何追踪或告诉我为什么得到返回结果的操作顺序吗。

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中的所有内容。
我到处都找过这样的例子,但似乎什么也找不到。我真的很感激所有的帮助。

5hcedyr0

5hcedyr01#

基本上,查询是在 table1 其中不存在值 table2 其中 table1.snumber 以及 table2.pnumber 不存在于 table3 . 所以,基本上它需要所有的价值观 table1 在那里有一排 table3 哪个配对 snumberpnumbertable2 .
另一种可能更容易理解的编写查询的方法是使用 JOIN 并计算输出中的行数。这个 HAVING 子句检查给定 snumberJOIN 结果与中的总行数相同 table2 ,即存在一个条目 table3 每一个组合 snumber 以及 pnumber 中的值 table2 :

SELECT t1.snumber
FROM table1 t1
JOIN table3 t3 ON t3.snumber = t1.snumber
JOIN table2 t2 ON t2.pnumber = t3.pnumber
GROUP BY t1.snumber
HAVING COUNT(*) = (SELECT COUNT(*) FROM table2)

输出(对于两个查询)

snumber
s1

sqlfiddle演示

相关问题