【问题标题】:T-SQL query to remove duplicates from large tables using join使用连接从大表中删除重复项的 T-SQL 查询
【发布时间】:2016-06-16 16:46:25
【问题描述】:

我是使用 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"

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

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

【问题讨论】:

    标签: tsql join sql-delete


    【解决方案1】:

    好吧,min 只会是一个,按 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
    

    【讨论】:

      【解决方案2】:

      另一种解决方案是:

      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
      

      问候。

      【讨论】:

        猜你喜欢
        • 2022-01-20
        • 2014-07-03
        • 2021-07-01
        • 2013-01-14
        • 2012-07-05
        • 2019-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多