NOT EXISTS

我们使用NOT EXISTS语句,最主要也是最困难的一个用法就是双重否定表示肯定。

SNO PNO JNO QTY
S1 P1 J1 200 S1 P1 J3 100 S1 P1 J4 700 S1 P2 J2 100 S2 P3 J1 400 S2 P3 J2 200 S2 P3 J4 500 S2 P3 J5 400 S2 P5 J1 400 S2 P5 J2 100 S3 P1 J1 200 S3 P3 J1 200 S4 P5 J1 100 S4 P6 J3 300 S4 P6 J4 200 S5 P2 J4 100 S5 P3 J1 200 S5 P6 J2 200 S5 P6 J4 500

这是一个工程表,SNO表示供应商代码,PNO是零件代码,JNO是工程号,QTY是数量

假设有一个题目问你:

查询所有至少使用了S1提供过的全部零件的工程

这里有歧义,S1提供了P1,P2两种零件,题目可能有两种理解

  • 这个工程至少使用了P1、P2两种零件而且都是S1提供的
  • 工程只要使用了P1、P2两种零件就符合要求了

这里我们采取后者。

那么我们的题目可以翻译成

求工程,不存在S1提供的零件类型该工程没有使用过。

我们来看三张图


代码如下:

select *
from spj x
where not exists
(
	select *
    from spj y
    where sno = 'S1' and not exists 
    (
		select * 
        from spj z
        where z.jno = x.jno and
        z.pno = y.pno
    ) 
);

推荐文章

SQL 中的 EXISTS 到底做了什么