废话少说,我们直接上要求:
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
)
)
讲到这里,有没有一种恍然大悟的感觉,很多时候,对于许多问题,只要我们转换一下思维,很多问题就不是问题了,希望对你有所帮助!!!