以下是“列出拥有所有可用颜色的项目的客户的查询”。 也就是说,对于每种可用颜色,客户拥有一些颜色 那种颜色的项目。“ 商品是客户购买的商品表
select cust#, cname
from Customer
except
select C.cust#, C.cname
from ( select D.cust#, A.colour
from Customer D,
Avail_Colours A
except
select I.cust#, I.colour
from Item I
) as M,
Customer C
where C.cust# = M.cust#;
如果我想将问题改为:“列出拥有某种可用颜色的所有商品的客户”,即列出客户拥有该颜色所有商品的可用颜色和客户,该怎么办?
答案 0 :(得分:0)
我无权访问DB2,因此无法测试它。请将其视为一个想法,而不是一个随时可用的解决方案。我使用标准SQL。
SELECT c.cust#, MAX(c.cname), a.colour
FROM Customer c
JOIN Items i ON c.cust# = i.cust#
JOIN Avail_Colors a ON a.colour=i.colour
GROUP BY c.cust#, i.colour
HAVING COUNT(*)=(SELECT COUNT(*) FROM Item WHERE i.colour = a.colour)
ORDER BY c.cust#
答案 1 :(得分:0)
以下版本假设颜色全部可用:
select i.cust#, i.colour, COUNT(distinct i.item#) as numItems
from items i join
(select i.cust# , COUNT(distinct i.item#) as numItems
from items i
group by i.cust#
) isum
on isum.cust# = i.cust#
group by i.cust#, i.colour
having i.numItems = max(isum.numItems)
它返回所有商品的客户编号和颜色(如果有)。
要获得可用的颜色,您只需将以下where
子句添加到子查询和外部查询中:
where colour in (select colour from Avail_Colours)
答案 2 :(得分:0)
(以下假设您正在寻找使用EXCEPT的解决方案。)
将所有可用商品的叉积与所有可用客户和所有可用颜色一起使用。现在,将所有现有项目与其实际所有者和颜色相结合。显然,如果客户拥有某种颜色的所有商品,则生成的商品将缺少该客户的相应颜色。如果您从所有客户和颜色的交叉产品中删除此结果集,您可以获得所有此类客户的列表及其“全套”颜色。
将上述内容翻译成EXCEPT SQL,以下是您可以获得的内容:
SELECT D.cust#,
D.name,
C.colour
FROM Customer D,
Avail_Colours C
EXCEPT
SELECT D.cust#,
D.name,
S.colour
FROM (
SELECT D.cust#,
I.item#,
C.colour
FROM Items I,
Customer D,
Avail_Colours C
EXCEPT
SELECT I.cust#,
I.item#,
I.colour
FROM Items I
) S
JOIN Customer D
ON D.cust# = S.cust#
;