删除具有相同第三层列值的反向元组

Remove reversed tuples with same third-tier column values

如何删除具有相同字母的反转 (m,n) <-> (n,m)?

Table
id1;id2;Letter
1;2;"A"
3;4;"B"
4;3;"B" ->  row to be deleted or the one above(3;4;"B"), no matter which one
5;6;"C"
6;5;"C" ->  row to be deleted or the one above(5;6;"C"), no matter which one
1;2;"B"

谢谢大家

假设此语法适用于 PostgreSQL(我已经好几年没用过了)

DELETE MT
FROM
    My_Table MT
WHERE
    MT.id1 > MT.id2 AND
    EXISTS
    (
        SELECT *
        FROM
            My_Table MT2
        WHERE
            MT2.id1 = MT.id2 AND
            MT2.id2 = MT.id1 AND
            MT2.letter = MT.letter  -- If this is also part of the requirement, otherwise you need logic on which row to keep
    )

另一种删除方法是:

delete 
  from table t
      USING table t2
 where t.id1 > t.id2
   and t.id1 = t2.id2 
   and t.id2 = t2.id1
   and t.Letter = t2.Letter;

您还应该考虑添加两个验证一个约束和一个索引以防止这种情况再次发生:

alter table table add constraint chk_diff_ids CHECK (id1 != id2);

CHECK CONSTRAINT 将避免 id1 插入等于 id2 之类的东西 1;1;'A'

CREATE UNIQUE INDEX idx_reverse_value
    ON table ( Letter, LEAST(id1,id2), GREATEST(id1,id2) );

这个索引将阻止创建一个你想删除的倒置值,所以如果你有 1,2,'B' 它会阻止插入 2,1,'B'

注意:table 是保留字,您不应将其用作 table 名称 :)

查看它在 fiddle 上的工作情况:http://sqlfiddle.com/#!15/17f00/2