在测试之后从2个表中删除记录以查看它们是否重复

时间:2013-05-09 12:18:53

标签: sql sql-server join duplicate-removal duplicate-data

在此处编辑其他人的SQL Server设计:

我的任务是从数据库中删除重复的行。

我有2个表:table1table2

  • table1包含T1ID, and T1NAME
  • table2T2ID, DATA1, DATA2, DATA3

  • 表格加入T1ID = T2ID

如果有多行具有相同的T1NAME, DATA1, DATA2 AND DATA3,我需要从两个表中删除其中的所有行。

2 个答案:

答案 0 :(得分:0)

未经测试,但尝试这样的事情

    ;with deleteThis
as
(
select   t1.id
        ,t2.data1
        ,t2.data2
        ,t2.data3
        ,row_number() over(partition by t1.id,t2.data1,t2.data2,t2.data3 order by t1.id) as rn
from table1 as t1
inner join table2 as t2
on t2.id = t1.id
)
delete from deleteThis
where rn > 1

答案 1 :(得分:0)

我想在table1中的t1id和table2中的t2id是用于反对表的主键。

如果是这样,您可以使用以下方法 -

1)如果要从两个表中删除,则需要将t1id(或t2id)存储到一个临时表中,以便可以使用删除第二个表的值

2)为了提取所需的t1id / t2id,你需要用T1name,Data1,Data2,Data3对连接表进行分组,然后选择你要获得多条记录的记录。

3)从发现删除的重复记录中只排除一个t1id。

所以为此您可以使用如下所示的一些命令 -

CREATE TABLE test_table
 as (SELECT T1id
      FROM Table1, Table2
     WHERE T1name, Data1, Data2,
     Data3 IN (SELECT T1name, Data1, Data2, Data3
                       FROM (SELECT T1name, Data1, Data2, Data3, COUNT(*)
                               FROM Table1, Table2
                              WHERE T1id = T2id
                              GROUP BY T1name, Data1, Data2, Data3
                             HAVING COUNT(*) > 1))
       AND T1id NOT IN (SELECT MIN(T1id)
                          FROM Table1, Table2
                         WHERE T1id = T2id
                         GROUP BY T1name, Data1, Data2, Data3));

DELETE FROM Table1 WHERE T1id IN (SELECT T1id FROM Test_Table);

DELETE FROM Table2 WHERE T2id IN (SELECT T1id FROM Test_Table);

COMMIT;

Drop TABLE Test_Table;