数据库原理联系题求详解

数据模型如下:
商品:P(PNO,PNAME,PRICE),分别表示商品号、名称、单价。
售货员:S(SNO,SNAME,SXB),分别表示售货员号、姓名、性别。
销售记录:R(PNO、SNO、NUM),分别表示商品号、售货员号、销售数量。
要求用SQL查询完成:
1、所有售货员都出售过的商品名称。(6分)
SELECT PNAME
  FROM P
  WHERE NOT EXIST
  ( SELECT *
   FROM S
   WHERE NOT EXIST
   ( SELECT *
    FROM R
    WHERE PNO=P.PNO AND SNO=S.SNO
   )
  );

不太理解这个答案的思路,不知道怎么拆分进行分步分析,请各位大神赐教

首先,EXISTS和NOT EXISTS强调的是是否返回结果集,不要求知道返回什么。
而NOT EXISTS引导的语句如果没有结果集返回,那么WHERE条件就成立。
好,一定先记住这一点。

然后往下分析。
最内层的条件WHERE PNO=P.PNO AND SNO=S.SNO,是对商品表和售货员表的一 一 列举。什么意思呢。比如:P表中有商品A,B;S表中有售货员X,Y。
那么,一 一列举就是:
WHERE PNO=A AND SNO=X
WHERE PNO=A AND SNO=Y
WHERE PNO=B AND SNO=X
WHERE PNO=B AND SNO=Y
列举每个售货员,卖出每种商品。然后对应R表进行筛选。
那么中间层对S的查询的否定,就是有某个售货员没有卖出过所有商品。不是所有售货员都没卖出任何商品。看看有没有这样的人。
然后最外层对P查询的否定,是找这样的商品:不存在这样一个人(中间层对S查询出来的人),这个人没有卖出过该商品。
这样找出来的商品,就是每个人都卖出过的商品。追问

也就是说:
1。最内层查询出来的是所有售货员售出的商品的集合;
2。中间层是对最内层的否定,也就是你说的,没有卖出过的所有商品的售货员的集合;
3。最外层的查询就是对中间层的否定,这样就变成了卖出过的所有商品的售货员的集合。
不知道我这样理解对不对?

追答

温馨提示:答案为网友推荐,仅供参考
相似回答