2009-03-10 8 views

Répondre

7

De here. Si vous ne l'avez pas déjà un champ « ID » qui identifie chaque ligne, vous devrez créer un pour que cela fonctionne (vous pouvez toujours déposer la colonne après que vous avez terminé):

DELETE 
FROM MyTable 
WHERE ID NOT IN 
(
SELECT MAX(ID) 
FROM MyTable 
GROUP BY DuplicateColumn1, DuplicateColumn2, DuplicateColumn2) 

En outre, faire une recherche sur ce site pour "supprimer les lignes dupliquées SQL Server" et vous verrez que cette question a déjà été répondu à plusieurs reprises ici.

+0

Un tel lien dans SO: http://stackoverflow.com/questions/18932/sql-how-can-i-remove-duplicate-rows – alextansc

+0

+1 pour être une bonne réponse, commentant le problème d'intégrité référentielle et m'enseignant quelque chose de nouveau tout en une seule fois. –

0

Utilisation:
Set RowCount 1

Ensuite, exécutez votre suppression sql

Cela supprimera 1 ligne, peu importe s'il y a plusieurs lignes correspondant.

Ensuite, fermez la fenêtre de requête ou utilisez Définissez RowCount 0 pour le réinitialiser.

2
DECLARE @Duplicates TABLE (AValue VARCHAR(32)) 

INSERT INTO @Duplicates VALUES ('No Duplicate') 
INSERT INTO @Duplicates VALUES ('Duplicate') 
INSERT INTO @Duplicates VALUES ('Duplicate') 


SELECT ID = IDENTITY(INT, 1, 1), * 
INTO #Duplicates 
FROM @Duplicates 

DELETE FROM #Duplicates 
FROM #Duplicates d 
    INNER JOIN (
     SELECT ID = MIN(ID) 
     FROM #Duplicates 
     GROUP BY AValue 
     HAVING COUNT(*) > 1 
    ) id ON id.ID = d.ID 

DELETE FROM @Duplicates 

INSERT INTO @Duplicates 
SELECT AValue FROM #Duplicates 

DROP TABLE #Duplicates 

SELECT * FROM @Duplicates 
0
  • Créer table temporaire avec le même schéma
  • INSERT INTO temptable SELECT DISTINCT * FROM oldtable
  • SUPPRIMER DE oldtable
  • INSERT INTO oldtable SELECT * FROM temptable
  • DROP temptable

Et n'oubliez pas:

  • Refactoriser vos tables pour ne pas permettre que cela se produise à nouveau
1
;WITH tempTable AS 
    ( 
      SELECT ROW_NUMBER() OVER (PARTITION BY Column1 ORDER BY Column2) AS rownumber,* 
      FROM @Table 
    ) 
    DELETE FROM tempTable WHERE rownumber > 1 

Il est récupéré à partir du lien de l'article mentionné dans l'une des réponses, mais juste pour sauver quelqu'un dans le futur ..

Questions connexes