2013-04-04 62 views
1

以下是「列出擁有所有可用顏色的項目的客戶的查詢」 也就是說,對於每種可用顏色,客戶擁有該顏色的某些 項目。 項目是由客戶使用EXCEPT的DB2 DB2查詢

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

我無權訪問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# 
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) 
0

將所有可用項目的交叉產品與所有可用客戶和所有可用顏色進行比較。現在拿掉所有現有物品,包括他們的實際所有者和顏色。顯然,如果客戶擁有某種顏色的所有物品,則所得到的集合將缺少該客戶的相應顏色。如果您從所有客戶和顏色的交叉產品中拿走這個結果集,您可以獲得所有這些客戶的列表以及他們的「全套」顏色。

翻譯到上述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# 
;