MSSQL自连接查询同值匹配时如何实现每对关系仅返回单次结果
MSSQL同属性值去重配对查询实现
问题本质
当前的自连接查询用a.name != b.name做过滤,只要两个记录的birthdate相同,就会互相匹配生成双向结果——也就是A匹配B、B也匹配A,最终产生两倍冗余的配对数据。要解决这个问题,核心是把无序的“不等判断”改成有序的严格大小判断,从连接逻辑上保证每对匹配仅触发一次。
可直接运行的查询
把原查询的不等条件替换成字典序的严格比较,就能直接得到符合要求的结果:
SELECT a.name, b.name AS name2 FROM #tmp_duplicates a JOIN #tmp_duplicates b ON b.birthdate = a.birthdate AND a.name < b.name -- 替换原WHERE子句中的a.name != b.name判断
执行后返回的结果和期望完全一致:
| name | name2 |
|---|---|
| John | Patrick |
| Ashley | Mary |
场景适配说明
- 如果表中存在重复的name记录,或者name存在大小写、前后空格的格式差异,单纯用name做比较可能出现匹配偏差,更稳妥的方式是用表的唯一主键(比如自增id)做有序比较,逻辑完全通用:
SELECT a.name, b.name AS name2 FROM #tmp_duplicates a JOIN #tmp_duplicates b ON b.birthdate = a.birthdate AND a.id < b.id - 该写法兼容同生日人数超过2的场景,会自动生成所有无双向重复的两两配对,不会出现冗余结果。
内容的提问来源于stack exchange,提问作者pt1xoom
相关产品推荐
相关产品推荐

