我有一个包含2列的表,其中包含一些具有唯一ID对的行,以及一些具有成对行的行,这些行是另一行的镜像副本。我想删除其中一个重复项。
id1 | id2
-----+-----
1 | 9
2 | 10
5 | 4
6 | 16
7 | 11
8 | 12
9 | 1
10 | 2
12 | 14
14 | 8
16 | 6
所以1 | 9
镜像9 | 1
。我想保留1 | 9
,但请删除9 | 1
。
我已经尝试过了。
SELECT
id1,
id2
FROM
(
SELECT
id1, id2, ROW_NUMBER() OVER (PARTITION BY id1, id2 ORDER BY id1) AS occu
FROM
table
) t
WHERE
t.occu = 1;
但它没有效果。
我对此非常陌生,所以你能给予的任何帮助都会非常感激。
==== UPDATE ====
我接受了@Mureinik的回答,并将其改编为子查询中的过滤器:
SELECT
*
FROM
table
WHERE
id1 NOT IN (SELECT
id1
FROM
table a
WHERE
id1 > id2
AND
EXISTS (SELECT *
FROM table b
WHERE a.id1 = b.id2 AND a.id2 = b.id1));
答案 0 :(得分:1)
您可以随意决定将行保留在id1 < id2
,并使用exists
子句查找其对应项:
DELETE FROM myable a
WHERE id1 > id2 AND
EXISTS (SELECT *
FROM mytable b
WHERE a.id1 = b.id2 AND a.id2 = b.id1)