【发布时间】:2012-08-23 18:02:57
【问题描述】:
我正在尝试使用 Oracle SQL 查询进行验证,想法是:
商品种类繁多,每一种商品都可能有多个供应商。
我有一组物品(在购物袋中),想验证它们之间是否至少有一个共同的供应商。这意味着所有包中的物品共享至少一个供应商。
简化,表格是:
带有 bag_id 和 item 列的 BAG 表。
SUPPLY 表,包含项目和供应商列。
谢谢!
【问题讨论】:
我正在尝试使用 Oracle SQL 查询进行验证,想法是:
商品种类繁多,每一种商品都可能有多个供应商。
我有一组物品(在购物袋中),想验证它们之间是否至少有一个共同的供应商。这意味着所有包中的物品共享至少一个供应商。
简化,表格是:
带有 bag_id 和 item 列的 BAG 表。
SUPPLY 表,包含项目和供应商列。
谢谢!
【问题讨论】:
这应该为您提供匹配多个项目的供应商列表,最常见的供应商位于顶部
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 语句包装它。
【讨论】:
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
【讨论】: