我有4张桌子:
我正在尝试找到订购了两个以上不同部分的客户订购的部件名称。 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;
任何帮助都将不胜感激。
答案 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
。