1

以下は、「利用可能なすべての色のアイテムを所有している顧客をリストする。つまり、利用可能なすべての色について、顧客はその色のアイテムを所有している」というクエリです。アイテムは、顧客が購入したアイテムのテーブルです

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

質問を次のように言い換えるとどうなるでしょうか: 「すべての商品をある色で所有している顧客を一覧表示する」つまり、在庫のある色と、顧客がその色のすべての商品を所有している顧客を一覧表示します。

4

3 に答える 3

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#
于 2013-04-04T18:41:35.170 に答える
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)
于 2013-04-04T18:51:15.837 に答える
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#
;
于 2013-04-04T21:37:14.343 に答える