这是清华版本的数据库教材上的一个题目,有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?
是例题答案错误还是什么?

解决方案 »

  1.   

    做一遍比看十遍更有效。
    这个题目用方法4最简单,所以,应该可以代替。
    方法1括号里是个子查询,而且是两个表(S 和 SPJ)的联合查询。所以会有S.SNO=SPJ.SNO
    方法3J.SNO=SPJ.SNO中的J是外层查询的表J
      

  2.   

    可是方法1里 表S用不到啊,只要SPJ不就可以了吗?他这里用表S的意义是什么呢?