求助: 一个简单的SQL语句
这是清华版本的数据库教材上的一个题目,有4种不同的解答,我看了后彻底晕菜了。
有4个关系: 供应商关系: S(SNO,SNAME,STATUS,ADDR)
零件关系: P(PNO,PNAME,COLOR,WEIGHT)
工程项目关系;J(JNO,JNAME,CITY,BALANCE)
供应情况关系:SPJ(SNO,PNO,JNO,PRICE,QTY)
检索没有使用编号为P3零件的工程编号JNO和名称JNAME。
方法1: SELECT JNO,JNAME
FROM J
WHERE JNO NOT IN
(SELECT JNO
FROM S,SPJ
WHERE S.SNO=SPJ.SNO AND PNO=‘P3’);
方法2: SELECT JNO,JNAME
FROM J
WHERE JNO <> JNO
(SELECT JNO
FROM SPJ
WHERE PNO=‘P3’);
方法3: SELECT JNO,JNAME
FROM J
WHERE NOT EXISTS
(SELECT *
FROM SPJ
WHERE J.SNO=SPJ.SNO AND PNO=‘P3’);
方法4:SELECT JNO,JNAME
FROM J
WHERE JNO NOT IN
(SELECT JNO
FROM SPJ
WHERE PNO=‘P3’);
请教众位大仙,(1) 方法1能不能直接用方法4代替?
(2) 方法1和3中的子查询里为什么一个是S.SNO=SPJ.SNO ,另一个是J.SNO=SPJ.SNO?
是例题答案错误还是什么?
------解决方案--------------------做一遍比看十遍更有效。
这个题目用方法4最简单,所以,应该可以代替。
方法1括号里是个子查询,而且是两个表(S 和 SPJ)的联合查询。所以会有S.SNO=SPJ.SNO
方法3J.SNO=SPJ.SNO中的J是外层查询的表J
------解决方案--------------------方法一可以用方法四代替。