2014-02-12 20 views
0

我在表中有几个字段,但希望删除一些记录。我会称它们为重复的,但它们并不真实。跨两个字段的SQL复制

表和一些示例数据

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 
       ); 
0

你可以使用一个INNER JOIN配对了换位Id1Id2值的任何行,筛选到那些真正复制,所有选择,但其中一个重复行,然后将结果发送到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 
0

从测试 删除其中ID1中( 选择a.id1 从测试一个内连接测试B上a.id1 = b.id2和a.id2 = b.id1和a.id1 < b .id1)

请务必注意,此代码不会删除id1 = id2的记录。