如何删除 2 列中的镜像值
How to delete mirrored values in 2 columns
我有一个包含 2 列的 table,其中一些行包含唯一 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;
但是没有效果。
我对此很陌生,所以如果您能提供任何帮助,我将不胜感激。
====更新====
我接受了@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));
您可以任意决定保留 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)
我有一个包含 2 列的 table,其中一些行包含唯一 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;
但是没有效果。
我对此很陌生,所以如果您能提供任何帮助,我将不胜感激。
====更新====
我接受了@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));
您可以任意决定保留 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)