我在表格中有几个字段,但希望删除一些记录。我会称它们为重复,但它们并不是真正意义上的。
表格和一些示例数据
Id1 Id2 Name1 Name2 DOB1 DOB2
123, abc, jones, smith, 19740901, 19820101
abc, 123, smith, Jones, 19820101, 19740901
def, 456, davis, short, 19720101, 20011010
456, def, short, davis, 20011010, 19720101
我想要做的是删除每个“重复”记录中的一个,因为它与另一个相同,但是“1列”与“2列”一起转置。任何帮助将不胜感激。
答案 0 :(得分:3)
以下是执行此操作的标准SQL方法:
delete from t
where Id1 > Id2 and
exists (select 1
from t t2
where t2.Id1 = t.Id2 and
t2.Id2 = t.Id1 and
t2.Name1 = t.Name2 and
t2.Name2 = t.Name1 and
t2.DOB1 = t.DOB2 and
t2.DOB2 = t.DOB1
);
答案 1 :(得分:0)
您可以使用INNER JOIN
将具有转置的Id1
和Id2
值的任何行配对,过滤到实际重复的行,选择除了其中一个重复行之外的所有行,然后将结果发送到DELETE
。
DELETE T1
FROM [TableName] T1
-- Pair up the duplicate rows
INNER JOIN [TableName] T2
ON T1.Id1 = T2.Id2
AND T1.Id2 = T2.Id1
WHERE T1.Id1 > T1.Id2 -- Only delete the row with the higher "Id1" value
-- Filter out any rows that are not actually duplicates
AND T1.Name1 = T2.Name1
AND T1.Name2 = T2.Name2
AND T1.Name2 = T2.Name2
AND T1.DOB1 = T2.DOB1
AND T1.DOB2 = T2.DOB2
答案 2 :(得分:0)
从测试中删除 其中id1 in( 选择a.id1 来自a.id1 = b.id2和a.id2 = b.id1和a.id1<的测试内连接测试b b.id1)
请务必注意,此代码不会删除id1 = id2的记录。