三个查询之间的差异

时间:2013-11-23 12:57:38

标签: mysql sql

首先,我将为练习发布正确的解决方案: 练习:获取未提供给项目J3的零件的零件号。

SELECT pno
FROM p
WHERE NOT EXISTS (
    SELECT *
    FROM spj
    WHERE spj.pno = p.pno
      AND spj.jno = 'J3'
    );

我的解决方案,它们都不正确:

SELECT DISTINCT p.pno
FROM (
  p INNER JOIN spj
    ON p.pno = spj.pno
  )
WHERE spj.jno <> 'J3';

SELECT DISTINCT p.pname
FROM (
  p INNER JOIN spj
    ON spj.pno = p.pno
  )
WHERE spj.jno NOT IN ('J3');

我有2个解决方案,我认为他们应该给出相同的答案,但他们没有。我的问题是,有什么区别。 (我的解决方案包括所有部分,正确的解决方案不包括第3部分)

1 个答案:

答案 0 :(得分:0)

对于第二个查询,您正在寻找与jno j3不同的零件和项目的组合。实际上,这为您提供了与不是j3的项目相关联的所有部分,但这并不表示该项目根本没有该部分。你只是将这些结果排除在外。

例如:

Project  Part
1        j3
1        a1
2        a1
3        j3

项目1和2都将被返回,因为两者都有一个与j3不同的部分。只排除3,因为除了j3之外没有其他部分可以匹配。


对于第三个查询,它实际上也是如此。