如何删除2列中的镜像值

时间:2017-06-28 06:51:02

标签: psql

我有一个包含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));

1 个答案:

答案 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)