问题描述
我需要删除已经匹配的用户匹配项。所以我有一个表:“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 的行。