0

Oracle SQLクエリを使用して検証を行おうとしていますが、アイデアは次のとおりです。

アイテムがあり、すべてのアイテムに対して複数のサプライヤーが存在する可能性があります。

(ショッピング バッグの中に) アイテムのセットがあり、それらの間に少なくとも 1 つの共通のサプライヤーがあるかどうかを確認したいと考えています。これは、バッグ内のすべてのアイテムが少なくとも 1 つのサプライヤーを共有していることを意味します。

単純化すると、テーブルは次のとおりです。

bag_id 列と item 列を含む BAG テーブル。
アイテムとサプライヤーの列を持つ SUPPLY テーブル。

ありがとうございました!

4

2 に答える 2

1

これにより、最も一般的なサプライヤーを先頭にして、複数のアイテムに一致するサプライヤーのリストが表示されます。

SELECT SUPPLY.supplier, COUNT(SUPPLY.item) item_count
FROM BAG
JOIN SUPPLY
  ON BAG.item = SUPPLY.item
GROUP BY SUPPLY.supplier
HAVING COUNT(SUPPLY.item) > 1
WHERE BAG.bag_id = ? --substitute bag_id
ORDER BY COUNT(SUPPLY.item) DESC

バッグ内のすべてのアイテムに一致するサプライヤーを見つける必要がある場合は、次のクエリを使用します。

SELECT SUPPLY.supplier
FROM BAG
JOIN (SELECT bag_id, COUNT(*) as item_count FROM BAG GROUP BY bag_id WHERE bag_id = ?) bag_count
  ON BAG.id = bag_count.bag_id
JOIN SUPPLY
  ON BAG.item = SUPPLY.item
GROUP BY SUPPLY.supplier
HAVING COUNT(SUPPLY.item) = bag_count.item_count
WHERE BAG.bag_id = ?

EXISTSこれをステートメントでラップすることにより、リストが空であるかどうかを確認して、共通のサプライヤーが存在しないかどうかを判断できます。

于 2012-08-23T18:06:30.413 に答える
0
select case when exists
                       (
                        select 1
                        from bag b
                             inner join item i on i.id = b.item_id
                             inner join supplier s on s.id = i.supplier_id
                                                   and s.is_main = 'Y'
                       )
             then 'Y'
             else 'N'   
       end contains_main_supplier                   
from dual
于 2012-08-23T18:16:12.047 に答える