0

在这里编辑别人的 SQL Server 设计:

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

我有 2 张桌子:table1table2.

  • table1有列T1ID, and T1NAME
  • table2有列T2ID, DATA1, DATA2, DATA3

  • 表加入T1ID = T2ID

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

4

2 回答 2

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
于 2013-05-09T12:42:56.437 回答
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;
于 2013-05-09T13:01:12.540 回答