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

如何关联含重复行的表?请求修正客户与采购表关联SQL语句

修正方案及原问题分析

原查询的问题

  1. 逻辑偏差:你的需求是获取每个客户的人口统计信息,但原查询用select distinct *会把两张表的所有列纳入去重判断。由于Table2同一客户id对应多行采购数据,只要Table2的列内容有差异,即使Table1的客户信息完全相同,distinct也会保留重复的客户行,无法保证每个客户只返回一条人口统计记录。
  2. 性能浪费:两张表都有10列以上,distinct需要对比所有列内容来去重,数据量大时会产生不必要的计算开销。

正确的SQL写法

根据你的需求,分场景给出最优写法:

场景1:需要所有客户的人口统计信息(无论是否有采购记录)

直接查询Table1即可,完全不需要关联Table2:

select * from Table1;

场景2:仅需要有采购记录的客户的人口统计信息

用exists子查询替代左连接+去重,性能更优,且能保证每个客户只返回一条记录:

select t1.*
from Table1 as t1
where exists (
    select 1 from Table2 as t2 where t2.id = t1.id
);

场景3:必须关联Table2(如需要同时获取采购数据字段)

如果确实需要关联Table2,但仍要保证每个客户只返回一条人口统计记录,可以用窗口函数过滤重复行:

select t1.*, t2.purchase_date, t2.amount -- 只选需要的Table2字段,避免冗余
from (
    select 
        t1.*,
        t2.purchase_date,
        t2.amount,
        row_number() over (partition by t1.id order by t2.purchase_date desc) as rn -- 按最新采购记录排序取第一条
    from Table1 as t1
    left join Table2 as t2 on t1.id = t2.id
) sub
where rn = 1;

内容的提问来源于stack exchange,提问作者アルサ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 01:10:27