在这里编辑别人的 SQL Server 设计:
我的任务是从数据库中删除重复的行。
我有 2 张桌子:table1
和table2
.
table1
有列T1ID, and T1NAME
table2
有列T2ID, DATA1, DATA2, DATA3
表加入
T1ID = T2ID
如果几行具有相同的T1NAME, DATA1, DATA2
, AND DATA3
,我需要从两个表中删除除一个之外的所有行。
在这里编辑别人的 SQL Server 设计:
我的任务是从数据库中删除重复的行。
我有 2 张桌子:table1
和table2
.
table1
有列T1ID, and T1NAME
table2
有列T2ID, DATA1, DATA2, DATA3
表加入T1ID = T2ID
如果几行具有相同的T1NAME, DATA1, DATA2
, AND DATA3
,我需要从两个表中删除除一个之外的所有行。
未经测试,但尝试这样的事情
;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
我猜 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;