SQL DB2查询使用EXCEPT

时间:2013-04-04 18:18:28

标签: sql 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#;

如果我想将问题改为:“列出拥有某种可用颜色的所有商品的客户”,即列出客户拥有该颜色所有商品的可用颜色和客户,该怎么办?

3 个答案:

答案 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#
;