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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 17:35:56