【问题标题】:Finding if there's at least one attribute in common in a set查找一组中是否至少有一个共同属性
【发布时间】:2012-08-23 18:02:57
【问题描述】:

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

商品种类繁多,每一种商品都可能有多个供应商。

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

简化,表格是:

带有 bag_id 和 item 列的 BAG 表。
SUPPLY 表,包含项目和供应商列。

谢谢!

【问题讨论】:

    标签: sql oracle


    【解决方案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 语句包装它。

    【讨论】:

    • 实际上查询返回每个供应商提供多少个项目,如果他们提供多于一个项目。我想我可以将最高结果与列表中的项目数进行比较。不过,不完全是我问的,但无论如何谢谢。 :)
    • 普通供应商 - 您的意思是对任何人通用还是对所有人通用?
    • 我的意思是所有项目中的共同点。例如,至少有一个供应商供应所有物品。
    【解决方案2】:
    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
    

    【讨论】:

    • 不能说清楚,但该查询不只是返回每个项目的主要供应商吗?
    • 查询返回您所要求的,即它返回袋子中是否包含至少一种主要产品,即用您的术语“蚂蚁来验证它们之间是否至少有一个共同供应商”
    • 其实我说的通用供应商,是指所有项目共享的供应商。所有项目共有的供应商。对不起,如果我表达错了..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多