在此处编辑其他人的SQL Server设计:
我的任务是从数据库中删除重复的行。
我有2个表:table1
和table2
。
table1
包含T1ID, and T1NAME
列 table2
列T2ID, DATA1, DATA2, DATA3
表格加入T1ID = T2ID
如果有多行具有相同的T1NAME, DATA1, DATA2
, AND DATA3
,我需要从两个表中删除其中的所有行。
答案 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;