如何关联含重复行的表?请求修正客户与采购表关联SQL语句
修正方案及原问题分析
原查询的问题
- 逻辑偏差:你的需求是获取每个客户的人口统计信息,但原查询用
select distinct *会把两张表的所有列纳入去重判断。由于Table2同一客户id对应多行采购数据,只要Table2的列内容有差异,即使Table1的客户信息完全相同,distinct也会保留重复的客户行,无法保证每个客户只返回一条人口统计记录。 - 性能浪费:两张表都有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,提问作者アルサ
相关产品推荐
相关产品推荐

