Left Join左连接查询去重:如何修改SQL语句避免返回重复记录
问题原因
左连接产生重复记录的核心原因是msis2表中存在多条MSISDN字段值相同的记录,当msis1和msis2按MSISDN关联时,msis1的单条记录会匹配msis2中所有同MSISDN的记录,最终输出多条重复结果。
解决方案
根据实际业务需求可以选择以下两种方案:
方案1:直接对查询结果去重
如果只要结果无重复、不需要指定多匹配行时msis2.c的取值规则,可以直接加DISTINCT关键字:
SELECT DISTINCT msis1.msisdn, msis1.a, msis2.c FROM msis1 LEFT JOIN msis2 ON msis1.msisdn = msis2.msisdn;
方案2:先对右表去重再关联
如果需要明确指定多匹配行时msis2.c的取值规则(比如取最大值、最小值、最新记录对应的值),可以先对msis2按MSISDN分组处理后再关联:
示例:取每个MSISDN对应的最大c值
SELECT msis1.msisdn, msis1.a, t.c FROM msis1 LEFT JOIN ( SELECT msisdn, MAX(c) AS c FROM msis2 GROUP BY msisdn ) t ON msis1.msisdn = t.msisdn;
如果需要取完整行的指定记录,可以用窗口函数筛选每个MSISDN下的第一条记录:
SELECT msis1.msisdn, msis1.a, t.c FROM msis1 LEFT JOIN ( SELECT msisdn, c, ROW_NUMBER() OVER (PARTITION BY msisdn ORDER BY 排序字段 DESC) AS rn FROM msis2 ) t ON msis1.msisdn = t.msisdn AND t.rn = 1;
把代码里的排序字段替换为你用来判断优先级的字段即可,比如时间字段等。
内容的提问来源于stack exchange,提问作者venkat M
相关产品推荐
相关产品推荐

