How to remove duplicate records in a table?

后端 未结 3 1853
离开以前
离开以前 2020-12-21 11:15

I\'ve got a table in a testing DB that someone apparently got a little too trigger-happy on when running INSERT scripts to set it up. The schema looks like this:

         


        
相关标签:
3条回答
  • 2020-12-21 11:33

    here is a great article on that: Deleting duplicates, which basically uses this pattern:

    WITH    q AS
            (
            SELECT  d.*,
                    ROW_NUMBER() OVER (PARTITION BY id ORDER BY value) AS rn
            FROM    t_duplicate d
            )
    DELETE
    FROM    q
    WHERE   rn > 1
    
    SELECT  *
    FROM    t_duplicate
    
    0 讨论(0)
  • 2020-12-21 11:36

    You don't give your table name but I think something like this should work. Just leaving the record which happens to have the lowest ID. You might want to test with the ROLLBACK in first!

    BEGIN TRAN
    DELETE <table_name>
    FROM <table_name> T1
    WHERE EXISTS(
    SELECT * FROM <table_name> T2 
    WHERE     
    T1.TYPE_INT = T2.TYPE_INT  AND
    T1.SYSTEM_VALUE = T2.SYSTEM_VALUE  AND
    T1.NAME = T2.NAME  AND
    T1.MAPPED_VALUE = T2.MAPPED_VALUE  AND
    T2.ID > T1.ID
    )
    
    SELECT * FROM <table_name>
    
    ROLLBACK
    
    0 讨论(0)
  • 2020-12-21 11:55
    WITH Duplicates(ID , TYPE_INT, SYSTEM_VALUE, NAME, MAPPED_VALUE )
    AS
    (
    SELECT  Min(Id)  ID  TYPE_INT, SYSTEM_VALUE, NAME, MAPPED_VALUE 
    FROM T1
    GROUP BY TYPE_INT, SYSTEM_VALUE, NAME, MAPPED_VALUE
    HAVING Count(Id) > 1
    )
    DELETE FROM T1
    WHERE ID IN (
    SELECT T1.Id
    FROM T1
    INNER JOIN Duplicates
    ON T1.TYPE_INT = Duplicates.TYPE_INT
    AND T1.SYSTEM_VALUE = Duplicates.SYSTEM_VALUE
    AND T1.NAME = Duplicates.NAME
    AND T1.MAPPED_VALUE = Duplicates.MAPPED_VALUE
    AND T1.Id <> Duplicates.ID
    ) 
    
    0 讨论(0)
提交回复
热议问题