2017-06-28 7 views
1

私は一意のIDペアを持つ行と別の行のミラー化された複製であるペアを持つ行を含む2列のテーブルを持っています。私は重複の1つを削除したい。2列のミラーリングされた値を削除する方法

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 | 11 | 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

あなたが任意に維持することを決定することもできます行は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) 
関連する問題