sql >> Databasteknik >  >> RDS >> PostgreSQL

Ta bort dubbletter från en tabell och länka om referensrader till den nya mastern

Detta enda kommando borde göra allt:

WITH blacklist AS (  -- identify duplicate IDs and their master
   SELECT *
   FROM  (
      SELECT transcription_id
           , min(transcription_id) OVER (PARTITION BY text, citation) AS master_id
      FROM   transcription
      ) sub
   WHERE  transcription_id <> master_id
   )
, upd AS (  -- redirect referencing rows
   UPDATE town_transcription tt
   SET    transcription_id = b.master_id
   FROM   blacklist b
   WHERE  b.transcription_id = tt.transcription_id
   )
DELETE FROM transcription t  -- kill dupes (now without reference)
USING  blacklist b
WHERE  b.transcription_id = t.transcription_id;

I brist på definition valde jag raden med minsta ID per grupp som överlevande huvudrad.

FK-begränsningar kommer inte i vägen om du inte har inställningar som inte är standard. Detaljerad förklaring:

Efter att ha tagit bort duperna kanske du nu vill lägga till en UNIQUE begränsning för att förhindra att samma fel uppstår igen:

ALTER TABLE transcription
ADD CONSTRAINT transcription_uni UNIQUE (text, citation);


  1. Hämta dynamiskt parameternamn och aktuella värden i T-SQL-lagrad procedur

  2. Returnera alla rader från en specifik partition i SQL Server (T-SQL)

  3. Hur SUBSTRING() fungerar i MariaDB

  4. Hur kan jag optimera den här frågan, tar mer än en minut att köra