T-SQL查询使用join

时间:2016-06-16 16:46:25

标签: tsql join sql-delete

我是使用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)中的外键。 我需要删除TableA中的副本,其中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"

但我仍然得到一些我需要删除的重复项。

使用join删除不完美重复行的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

好的最小只会是一个,而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

答案 1 :(得分:0)

另一种解决方案是:

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

问候。