删除具有相同第三层列值的反向元组
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
如何删除具有相同字母的反转 (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