web-dev-qa-db-fra.com

SQL Server 2008: supprimer les lignes en double

J'ai des lignes en double dans ma table, comment puis-je les supprimer en fonction de la valeur d'une seule colonne?

Par exemple

uniqueid, col2, col3 ...
1, john, simpson
2, sally, roberts
1, johnny, simpson

delete any duplicate uniqueIds
to get 

1, John, Simpson
2, Sally, Roberts
9
Fearghal

Vous pouvez DELETE à partir d'un cte:

WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid ORDER BY col2)'RowRank'
             FROM Table)
DELETE FROM cte 
WHERE RowRank > 1

La fonction ROW_NUMBER() attribue un numéro à chaque ligne. PARTITION BY est utilisé pour recommencer la numérotation de chaque élément de ce groupe. Dans ce cas, chaque valeur de uniqueid commence à numéroter à 1 et commence à partir de là. ORDER BY détermine l'ordre dans lequel les numéros vont. Comme chaque uniqueid est numérotée à partir de 1, tout enregistrement avec un ROW_NUMBER() supérieur à 1 a un doublon uniqueid

Pour comprendre le fonctionnement de la fonction ROW_NUMBER(), essayez-la:

SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid ORDER BY col2)'RowRank'
FROM Table
ORDER BY uniqueid

Vous pouvez ajuster la logique de la fonction ROW_NUMBER() pour définir l’enregistrement que vous souhaitez conserver ou supprimer.

Par exemple, vous voudrez peut-être effectuer cette opération en plusieurs étapes, en supprimant d’abord les enregistrements portant le même nom de famille mais des prénoms différents, et vous pouvez ajouter le nom de famille au PARTITION BY:

WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid, col3 ORDER BY col2)'RowRank'
             FROM Table)
DELETE FROM cte 
WHERE RowRank > 1
34
Hart CO

Vous avez probablement un identifiant de ligne que est attribué par la base de données lors de l'insertion et qui est en fait unique. Je vais appeler ce rowId dans mon exemple.

rowId |uniqueid |col2  |col3
----- |-------- |----  |----
1      10        john   simpson
2      20        sally  roberts
3      10        johnny simpson

Vous pouvez supprimer les doublons en regroupant les éléments supposés uniques (qu’il s’agisse d’une colonne ou de plusieurs colonnes), puis récupérez un rowId dans chaque groupe et supprimez tout le reste en dehors de ces rowIds. Dans la requête interne, tout ce qui se trouve dans la table aura un rowId, à l'exception des lignes en double.

select * 
--DELETE 
FROM MyTable 
WHERE rowId NOT IN 
(SELECT MIN(rowId) 
 FROM MyTable 
 GROUP BY uniqueid);

Vous pouvez également utiliser MAX au lieu de MIN avec des résultats similaires.

2
CowboyBebop

Vous avez plusieurs façons de supprimer les enregistrements en double, dont certains sont en dessous.

Différentes façons de supprimer les enregistrements en double

Utilisation de la fonction Row_Number () et du CTE

  with CTE(DuplicateCount) as  ( SELECT  ROW_NUMBER() OVER
(PARTITION by UniqueId order by UniqueId ) as DuplicateCount from
Table1 ) Delete from CTE where DuplicateCount > 1

  .Without using CTE*

Delete DuplicateCount from ( Select Row_Number() over(Partition by
UniqueId order by UniqueId) as Dup from Table1 ) DuplicateCount 
where DuplicateCount.Dup > 1

 .Without using row_Number() and CTE

Delete from Subject where RowId not in(select Min(RowId ) from
Subject group by UniqueId)
1
Ganesh Kumar
DECLARE @du TABLE (
    id INT,  
    Name VARCHAR(4)
)

INSERT INTO @du VALUES(1,'john')
INSERT INTO @du VALUES(2,'jane')
INSERT INTO @du VALUES(1,'john')

;WITH dup (id,dp)
AS
(SELECT id
, ROW_NUMBER() OVER(PARTITION BY id ORDER BY Name) AS dp
FROM @du)
DELETE FROM dup
WHERE dp > 1

SELECT *
FROM @du
1
user123

Voici la magie simple pour supprimer les doublons

select * into NewTable from ExistingTable
union
select * from ExistingTable;
1

DELETE FROM table WHERE uniqueid='1' AND col2='john' Ou vous changez col2='john' en col2='johnny'. Dépend de l'enregistrement que vous souhaitez supprimer.

Comment vous êtes-vous retrouvé avec deux mêmes identifiants "uniques"?

1
waka