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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 04:26:55