有一供应商供应该零件的关系模式为SP(Sno,Pno,Qty)
Sno:供应商号 Pno:零件号 Qty:零件数量
SELECt Sno
FROM SP SPX
WHERe NOT EXISTS
(SELECt * FROM SP SPY
WHERe SPY.Sno='168' AND NOT EXISTS
(SELECt * FROM SP SPZ
WHERe SPZ.Sno=SPX.Sno AND SPZ.Pno=SPY.Pno
)
)
听说这是:查询到少包含了供应商"168"所供应的全部零件的供应商号的SQL语句。
看了很多遍,看不懂。。是不是两个NOT就把它给NOT成非NOT的呢。。。。
靠,还真是绕人,看了我半天才看懂,不过不太好解释,我试着说说。
首先,楼主的听说是正确的。
其次,我们把第一个not Exists称为不存在,第二个not Exists称为没有,以便区别。
第三,翻译SQL语句,供应商是'168'时,不存在没有这种供应商的零件的集合,也就是只要供应商不等于'168',就一定要有'168'所有的零件。
楼主可以试着从子查询逐渐向外,设想两个相同的表连接查询,再用条件过滤,我表达能力有限。。。
查找不存在SPZ.Sno=SPX.Sno AND SPZ.Pno=SPY.Pno AND SPY.Sno='168'这种关系的Sno,
from SPX NOT是取反,但是这里是用两个子查询去找满足“不存在”关系的内容。NOT EXISTS即“不存在”