跨2个字段的SQL复制

时间:2014-02-12 17:06:29

标签: 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列”一起转置。任何帮助将不胜感激。

3 个答案:

答案 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将具有转置的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

答案 2 :(得分:0)

从测试中删除 其中id1 in(   选择a.id1   来自a.id1 = b.id2和a.id2 = b.id1和a.id1<的测试内连接测试b b.id1)

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