Left Join关联两表后记录数超出原表总数问题咨询
问题原因
- 表2的
name字段存在重复值,表1里的某一条name记录,在表2中对应多条匹配记录,Left Join会把这些匹配结果全部保留,最终总条数就会超过表1的原始行数。比如表1有1条"张三",表2里有3条"张三",关联后就会生成3条"张三"的记录,累加起来总条数自然超过表1的191463条。
解决办法
根据你要保留表1所有记录+表2对应关联值的需求,分场景处理:
场景1:只需要表2中匹配name的任意一条记录
如果不需要表2中所有匹配项,只要任意一条就行,用下面两种方式:
- 用
DISTINCT去重:
SELECT DISTINCT t1.name, t2.number, t2.residence, t2.phone FROM 表1 t1 LEFT JOIN 表2 t2 ON t1.name = t2.name;
- 用聚合函数(比如
MAX/MIN)取每个name对应的唯一值:
SELECT t1.name, MAX(t2.number) AS number, MAX(t2.residence) AS residence, MAX(t2.phone) AS phone FROM 表1 t1 LEFT JOIN 表2 t2 ON t1.name = t2.name GROUP BY t1.name;
场景2:需要取表2中符合特定规则的记录
如果要指定取表2里的特定记录(比如最新录入的),先预处理表2筛选出每个name的目标记录,再和表1关联:
-- 假设表2有create_time字段,取每个name最新的记录 WITH unique_t2 AS ( SELECT name, number, residence, phone, ROW_NUMBER() OVER (PARTITION BY name ORDER BY create_time DESC) AS rn FROM 表2 ) SELECT t1.name, ut2.number, ut2.residence, ut2.phone FROM 表1 t1 LEFT JOIN unique_t2 ut2 ON t1.name = ut2.name AND ut2.rn = 1;
场景3:业务上表2的name应该唯一
如果业务逻辑里表2的name本应是唯一值,那说明表2存在脏数据,先清理重复的name记录(比如删除重复项或合并数据),再执行Left Join。
内容的提问来源于stack exchange,提问作者Sami Tarawneh
相关产品推荐
相关产品推荐

