LEFT JOIN匹配后出现额外空行重复,右表无NULL值如何解决
左连接返回多余NULL行问题排查与解决
根因分析
- 核心原因是右表
#temp_covid_inventory存在重复的(fac_abbrv, date)关联键组合:你已验证右表无NULL值,但未排查重复行。75组可匹配的关联键在右表中每条对应2条重复记录,左表1行匹配到右表2行时会返回2条结果,75*2=150,加上1条无匹配的左表行,总结果就是151行,与你遇到的现象完全吻合。 - 可优先执行以下语句验证该结论:
SELECT fac_abbrv, date, COUNT(1) cnt FROM #temp_covid_inventory GROUP BY fac_abbrv, date HAVING COUNT(1) > 1
如果执行后返回75条记录、每条cnt为2,即可确认该问题。
- 补充排查点:也可执行
SELECT COUNT(1) FROM #temp_fac_datesx确认左表行数确实为76,排除左表本身重复的可能性,从给出的数值来看右表重复概率更高。
解决方案
方案1:关联前对右表去重(推荐)
如果业务不需要右表重复行的额外数据,先按关联键对右表去重后再关联,可根据业务需求调整排序逻辑(如下方按createdAt倒序取最新记录):
select f.facility [Facility Code] , m.the_start , m.the_stop , case when m.date is NULL then @current_start else CAST(Convert(date, m.date) as DateTime) end as [Inventory Date] , m.[createdAt] as last_entry_date from #temp_fac_datesx f left join ( SELECT * FROM ( SELECT *, ROW_NUMBER() OVER(PARTITION BY fac_abbrv, date ORDER BY createdAt DESC) rn FROM #temp_covid_inventory ) t WHERE rn = 1 ) m on f.facility = m.[fac_abbrv] AND f.[Inventory Date] = m.date;
方案2:新增关联条件
如果业务需要保留右表重复行,可新增更多关联条件缩小匹配范围,避免一对多关联生成多余行。
内容的提问来源于stack exchange,提问作者Son of Arathorn
相关产品推荐
相关产品推荐

