PostgreSQL 中所有方式删除与已匹配用户的匹配

问题描述

我需要删除已经匹配的用户匹配项。所以我有一个表:“MatchingUser”,看起来像这样:

id | idUser1 | idUser2
1       1         2
2       1         3
3       1         2
4       2         1

在这个例子中,我想删除条目 3 和 4,因为匹配与条目 1 相同:如果 1 与 2 匹配,我需要删除 3,因为它是相同的匹配,也是 4,因为 2 匹配 1 是与1匹配2相同。

我已经有了这个:

DELETE FROM "WU_MatchingUsers" WHERE "id" IN (SELECT "id" FROM (SELECT "id",ROW_NUMBER() OVER( PARTITION BY "IDWU_User1","IDWU_User2" ORDER BY "id" DESC) AS row_num FROM "WU_MatchingUsers") t WHERE t.row_num >1);

这个已经删除了相同的匹配,所以在我们的例子中这个已经删除了条目 3 而不是 4,我想在这查询添加一些东西来删除条目 4。

解决方法

我会使用 EXISTS 条件

delete from MatchingUser mu1
where exists (select * 
              from MatchingUser mu2
              where mu2.id < mu1.id
                and least(mu2.iduser1,mu2.iduser2) = least(mu1.iduser1,mu1.iduser2)
                and greatest(mu2.iduser1,mu2.iduser2) = greatest(mu1.iduser1,mu1.iduser2))

这会删除所有 iduser1/iduser2 组合相同但 ID 值高于现有行的行。所以在这种情况下,ID = 3 和 ID = 4 的行。