SQL的EXISTS双重否定

在这里插入图片描述

NOT EXISTS

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

SNOPNOJNOQTY
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 到底做了什么

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值