查找集合中是否存在至少一个共同属性

时间:2012-08-23 18:02:57

标签: sql oracle

我正在尝试使用Oracle SQL查询进行验证,其想法是:

有些项目,每个项目可能有多个供应商。

我有一组物品(在购物袋中),并想验证它们之间是否至少有一个共同的供应商。这意味着行李中的全部共享至少一个供应商。

简化,表格是:

包含bag_id和项目列的BAG表 包含项目和供应商列的SUPPLY表。

谢谢!

2 个答案:

答案 0 :(得分: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语句包装此列表来确定是否存在常见供应商。

答案 1 :(得分: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