SQL Server中双向关联表去重的TSQL优雅实现方案问询
解决SQL Server中双向关联重复记录的保留问题
方法1:字段大小比较筛选(最简洁高效)
核心逻辑是只保留每组双向关联中的其中一个方向的记录,比如只保留ID1 <= ID2的行,自动排除反向重复项。假设表名为YourTable,关联字段为ID1和ID2:
SELECT * FROM YourTable WHERE ID1 <= ID2;
如果需要保留反向的那条,只需将条件改为ID1 > ID2。该方法性能最优,可直接利用字段索引(若存在)。
方法2:窗口函数分组去重(支持复杂场景)
若表中包含其他字段,或需要按特定规则保留记录(如保留创建时间最早/最新的),可使用ROW_NUMBER()窗口函数,将(ID1,ID2)和(ID2,ID1)视为同一分组,再筛选每组第一条:
WITH CTE_Duplicates AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY CASE WHEN ID1 < ID2 THEN ID1 ELSE ID2 END, CASE WHEN ID1 < ID2 THEN ID2 ELSE ID1 END ORDER BY ID1 -- 可替换为其他字段,比如 CreateTime DESC 保留最新记录 ) AS RowNum FROM YourTable ) SELECT * FROM CTE_Duplicates WHERE RowNum = 1;
方法3:自连接排除反向记录(逻辑直观)
通过自连接匹配反向记录,排除存在对应反向项的行:
SELECT t1.* FROM YourTable t1 LEFT JOIN YourTable t2 ON t1.ID1 = t2.ID2 AND t1.ID2 = t2.ID1 AND t1.ID1 > t2.ID1 -- 避免双向互相匹配 WHERE t2.ID1 IS NULL;
该方法逻辑清晰,但数据量较大时性能不如前两种。
内容的提问来源于stack exchange,提问作者saascosam
相关产品推荐
相关产品推荐

