SQL - 查找订购了2个以上不同零件的客户订购的零件

时间:2015-03-01 23:28:48

标签: mysql sql sql-server oracle

我有4张桌子:

  • 客户:cno(主键),cname,街道,拉链,手机
  • 订单:ono(主键),cno(外键),wno(外键),收到,发货
  • odetails :ono(外键),pno(外键),qty,sfee
  • 部分:pno(主键),pname,qoh,price,olevel

我正在尝试找到订购了两个以上不同部分的客户订购的部件名称。 This线程的相关性最接近并且帮助了我很多,但是我在运行修改后的查询时遇到了问题,这是以下内容并返回null:

SELECT p.pname
FROM parts p
INNER JOIN odetails d ON p.pno=d.pno
INNER JOIN orders o ON d.ono=o.ono
INNER JOIN customers c ON o.cno=c.cno
GROUP BY p.pname, c.cname
HAVING COUNT(DISTINCT p.pno)>2;

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

更改

GROUP BY p.pname, c.cname

GROUP BY c.cname

如果您按p.pname进行分组,则COUNT(DISTINCT p.pno)将始终返回1 ,除非两个pno具有相同的pname < / p>

答案 1 :(得分:0)

我假设您正在使用Oracle,因为your other question using the same tables for a different query是一个Oracle问题。

要考虑的一些事情。是否有多个客户订购了两个以上不同的零件?如果是这样,您是否要将客户名称与订购的零件一起退回?首先,获得订购了两个以上不同部分的所有客户:

SELECT c.cno
  FROM customers c INNER JOIN orders o
    ON c.cno = o.cno
 INNER JOIN odetails od
    ON o.ono = od.ono
 GROUP BY c.cno
HAVING COUNT(DISTINCT od.pno) > 2;

然后获取他们订购的零件:

WITH c1 AS (
    SELECT c.cno
      FROM customers c INNER JOIN orders o
        ON c.cno = o.cno
     INNER JOIN odetails od
        ON o.ono = od.ono
     GROUP BY c.cno
    HAVING COUNT(DISTINCT od.pno) > 2
)
SELECT p.pno, p.pname, COUNT(*)
  FROM parts p INNER JOIN odetails od
    ON p.pno = od.pno
 INNER JOIN orders o
    ON od.ono = o.ono
 INNER JOIN c1
    ON o.cno = c1.cno
 GROUP BY p.pno, p.pname;

顺便说一句,你应该考虑@ Strawberry的评论。你的表名很好,但是你的列的名字真的很可怕。 Oracle为对象名称提供30个字符;使用它们。例如,没有理由将列命名为pno,而不是product_id