sql双not exists实现除法

废话少说,我们直接上要求:

J(工程)表
在这里插入图片描述
J(零件)表
在这里插入图片描述

SPJ(工程供应)表
在这里插入图片描述

查询至少使用了S2供应商所供应的全部零件(Jno 工程号,Jname 工程名)。

我们先直接上答案:
select jno,jname
from J
where not exists(
select *
from SPJ A
where Sno = ‘S2’
and not exists(
select *
from SPJ B
where B.Jno = J.Jno
and B.Pno = A.Pno
)
)
当初刚看这个语句的时候,总是转不过弯来,逻辑总是理不清楚!!事实就是如此,我们直接从问题本身来看这个答案的话一般都很难理顺,既然如此,我们何不换个角度来。

如下:

首先我们看问题,查询至少使用了S2供应商所供应的全部零件(Jno 工程号,Jname 工程名)。那么也就是找一个工程,什么样的工程的呢?这个工程不存在对于S2提供的全部零件,不存在没有供应记录的情况。下面我们将这句话与上面的语句对应起来。

第一步 找一个工程,不存在某种东西,把不存在的框架先写出来

select jno, jname
from J where not exists(

第二步 找S2提供的零件,对于这个工程来说,不存在S2提供的零件,所以不存在后面是这些零件

select jno,jname
from J
where not exists(
select *
from SPJ A
where Sno = ‘S2’

第三步 对于这些零件来说,不存在某些东西,把不存在的框架写出来

select jno,jname
from J
where not exists(
select *
from SPJ A
where Sno = ‘S2’
and not exists(


第四步 找供应记录,对于这些零件来说,不存在没有供应记录的情况

select jno,jname
from J
where not exists(
select *
from SPJ A
where Sno = ‘S2’
and not exists(
select *
from SPJ B

)
)

第五步 说明这个记录要满足的条件,这里我们只要说明最内层的select找的记录是属于这个工程的,以及这条记录供应的零件是S2供应的

select jno,jname
from J
where not exists(
select *
from SPJ A
where Sno = ‘S2’
and not exists(
select *
from SPJ B
where B.Jno = J.Jno
and B.Pno = A.Pno
)
)

讲到这里,有没有一种恍然大悟的感觉,很多时候,对于许多问题,只要我们转换一下思维,很多问题就不是问题了,希望对你有所帮助!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值