Can I delete database duplicates based on multiple columns?

后端 未结 2 820
死守一世寂寞
死守一世寂寞 2021-02-13 18:54

I asked this question a while back to delete duplicate records based on a column. The answer worked great:

delete from tbl
where id NOT in
(
select  min(id)
fro         


        
2条回答
  •  刺人心
    刺人心 (楼主)
    2021-02-13 19:40

    This shows the rows you want to keep:

    ;WITH x AS 
    (
      SELECT col1, col2, col3, rn = ROW_NUMBER() OVER 
          (PARTITION BY col1, col2, col3 ORDER BY id)
      FROM dbo.tbl
    )
    SELECT col1, col2, col3 FROM x WHERE rn = 1;
    

    This shows the rows you want to delete:

    ;WITH x AS 
    (
      SELECT col1, col2, col3, rn = ROW_NUMBER() OVER 
          (PARTITION BY col1, col2, col3 ORDER BY id)
      FROM dbo.tbl
    )
    SELECT col1, col2, col3 FROM x WHERE rn > 1;
    

    And once you're happy that the above two sets are correct, the following will actually delete them:

    ;WITH x AS 
    (
      SELECT col1, col2, col3, rn = ROW_NUMBER() OVER 
          (PARTITION BY col1, col2, col3 ORDER BY id)
      FROM dbo.tbl
    )
    DELETE x WHERE rn > 1;
    

    Note that in all three queries, the first 6 lines are identical, and only the subsequent query after the CTE has changed.

提交回复
热议问题