You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:44:01