Oracle SQL:使用DISTINCT后如何展示多供应商对应的重复产品记录
解决方案:找出同一产品对应的多个供应商记录
看起来你需要的是那些对应多个不同供应商的产品,并列出它们所有的供应商关联记录,而不是用DISTINCT把同一产品的不同供应商合并成一条。之前的HAVING没生效是因为你用了DISTINCT,导致每个产品只有一条记录,自然无法筛选出“重复”(多供应商)的情况。
下面提供两种可行的方案:
方法1:使用窗口函数(推荐,更简洁)
先获取符合业务规则的所有产品-供应商关联对(去重,避免同一产品-供应商因多个PO重复),然后用窗口函数统计每个产品的供应商数量,筛选出数量大于1的记录:
with product_supplier_pairs as ( -- 先获取去重后的产品-供应商关联,排除同一产品同一供应商的重复PO记录 select distinct tbl1.Product_ID, tbl2.Supplier_ID from tbl3 inner join tbl1 on tbl1.Product_ID = tbl3.Product_ID inner join tbl2 on tbl3.PO_number = tbl2.PO_number where tbl1.Season_ID = 'AA18' ) select Product_ID, Supplier_ID from ( -- 给每个产品标记它对应的供应商总数 select Product_ID, Supplier_ID, count(*) over (partition by Product_ID) as total_suppliers from product_supplier_pairs ) -- 只保留有多个供应商的产品记录 where total_suppliers > 1 order by Product_ID, Supplier_ID;
方法2:使用子查询+分组筛选
如果你的Oracle版本不支持窗口函数(比较旧的版本),可以用子查询先找出有多个供应商的产品ID,再关联获取对应的供应商记录:
-- 先定义去重后的产品-供应商关联对 with product_supplier_pairs as ( select distinct tbl1.Product_ID, tbl2.Supplier_ID from tbl3 inner join tbl1 on tbl1.Product_ID = tbl3.Product_ID inner join tbl2 on tbl3.PO_number = tbl2.PO_number where tbl1.Season_ID = 'AA18' ) select ps.Product_ID, ps.Supplier_ID from product_supplier_pairs ps -- 筛选出那些有多个供应商的产品ID where ps.Product_ID in ( select Product_ID from product_supplier_pairs group by Product_ID having count(distinct Supplier_ID) > 1 ) order by ps.Product_ID, ps.Supplier_ID;
为什么你之前的HAVING没生效?
你原来的查询用了DISTINCT,这会让每个Product_ID只返回一条记录(即使它对应多个供应商),所以分组后count(*)永远是1,HAVING count(*) >1自然不会返回任何结果。我们需要先去掉DISTINCT,或者先获取去重后的产品-供应商唯一对,再对产品ID分组统计供应商数量,才能筛选出目标记录。
根据你提供的业务规则和数据示例,上面的查询会返回你预期的结果:比如ID-1对应的多个供应商,ID-4对应的所有供应商记录。
内容的提问来源于stack exchange,提问作者A.Rosso
相关产品推荐
相关产品推荐

