PostgreSQL如何删除用户匹配表中所有双向重复的匹配记录
SQL修改方案
核心调整逻辑
- 原有语句的分组依据是原始的
IDWU_User1、IDWU_User2字段顺序,无法识别反向的用户匹配对。调整时需要先把两个用户ID做标准化处理:将较小的用户ID作为第一个分组键,较大的作为第二个分组键,这样(1,2)和(2,1)会被识别为同一组匹配记录。 - 排序规则可以根据你的保留需求调整:如果要保留最早生成的匹配(id最小的记录),排序用
id ASC;如果要保留最新生成的匹配,排序用id DESC。
修改后完整SQL语句
DELETE FROM "WU_MatchingUsers" WHERE "id" IN ( SELECT "id" FROM ( SELECT "id", ROW_NUMBER() OVER( PARTITION BY LEAST("IDWU_User1", "IDWU_User2"), GREATEST("IDWU_User1", "IDWU_User2") ORDER BY "id" ASC ) AS row_num FROM "WU_MatchingUsers" ) t WHERE t.row_num > 1 );
效果验证
对应你给出的示例数据,执行后分组逻辑如下:
| id | idUser1 | idUser2 | 标准化分组键 | row_num | 是否删除 |
|---|---|---|---|---|---|
| 1 | 1 | 2 | (1,2) | 1 | 保留 |
| 2 | 1 | 3 | (1,3) | 1 | 保留 |
| 3 | 1 | 2 | (1,2) | 2 | 删除 |
| 4 | 2 | 1 | (1,2) | 3 | 删除 |
正好符合你需要删除id3、id4的需求。
内容的提问来源于stack exchange,提问作者LeMecWeird
相关产品推荐
相关产品推荐

