日期:2014-05-17  浏览次数:20428 次

求助: 一个简单的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
------解决方案--------------------
方法一可以用方法四代替。