SQL查询使用连接从大型表中删除重复项
我是使用T-SQL查询的新手,我尝试了不同的解决方案,以从精灵大表(超过270,000行)中删除重复的行。 表格如下所示:
TableA
-----------
RowID int not null identity(1,1) primary key,
Col1 varchar(50) not null,
Col2 int not null,
Col3 varchar(50) not null
由于存在RowID标识字段,此表的行不完美。 我需要加入的第二张表格:
TableB
-----------
RowID int not null identity(1,1) primary key,
Col1 int not null,
Col2 varchar(50) not null
在TableA中,我有这样的东西:
1 | gray | 4 | Angela
2 | red | 6 | Diana
3 | black| 6 | Alina
4 | black| 11 | Dana
5 | gray | 4 | Angela
6 | red | 12 | Dana
7 | red | 6 | Diana
8 | black| 11 | Dana
并在表B中:
1 | 6 | klm
2 | 11 | lmi
TableB(Col1)的第二列是TableA(Col2)中的外键。 我只需要删除Table2中Col2 = 6的重复项,忽略其他重复项。
1 | gray | 4 | Angela
2 | red | 6 | Diana
4 | black| 6 | Alina
5 | black| 11 | Dana
6 | gray | 4 | Angela
7 | red | 12 | Dana
8 | black| 11 | Dana
我试过使用
DELETE FROM TableA a inner join TableB b on a.Col2=b.Col1
WHERE a.RowId NOT IN (SELECT MIN(RowId) FROM TableA GROUP BY RowId, Col1, Col2, Col3) and b.Col2="klm"
但我仍然得到一些我需要删除的重复项。
使用连接删除不完美重复行的最佳方法是什么?
好的分钟只会是一个,PK组会给你一切
并且该示例中的RowID是错误的
DELETE FROM TableA a
inner join TableB b
on a.Col2=b.Col1
WHERE a.RowId NOT IN (SELECT MIN(RowId)
FROM TableA GROUP BY RowId, Col1, Col2, Col3)
and b.Col2="klm"
这将是要删除的行
select *
from
( select *
, row_number over (partition by Col1, Col3 order by RowID) as rn
from TableA a
where del.Col2 = 6
) tt
where tt.rn > 1
另一个解决方案是
WITH CTE AS(
SELECT t.[col1], t.[col2], t.[col3], t.[col4],
RN = ROW_NUMBER() OVER (PARTITION BY t.[col1], t.[col2], t.[col3], t.[col4] ORDER BY t.[col1])
FROM [TableA] t
)
delete from CTE WHERE RN > 1
问候。
链接地址: http://www.djcxy.com/p/24735.html上一篇: SQL query to remove duplicates from large tables using join