7
votes

Suppression d'enregistrements en double à l'aide d'une requête seulement

J'utilise SQL Server 2005.

J'ai une table comme celle-ci - p> xxx pré>

Dans ce cas, je veux supprimer toutes les entrées en double et conserver une seule instance AS - P>

ID     Name
1       a
2       b
3       c
4       d


2 commentaires

Pourquoi avez-vous approuver cette modification suggérée non valide ? S'il vous plaît prendre du temps pour l'examiner correctement.


@ HIMS056 - son édité maintenant de manière appropriée. Merci.


5 Réponses :


-1
votes
delete from table1
USING table1, table1 as vtable
WHERE (NOT table1.ID=vtable.ID)
AND (table1.Name=vtable.Name)

3 commentaires

Êtes-vous sûr que vous utilisez est disponible dans SQL Server? Je reçois une erreur de syntaxe près de l'utilisation.


Désolé, je l'ai testé pour MySQL, je pensais que cela fonctionne aussi sur SQL. Quelle erreur obtenez-vous?


Pas de problème, j'ai une syntaxe incorrecte près de l'utilisation. Je ne pense pas qu'il n'y ait aucun travail clé dans SQL. Il sera converti à partir de.



-1
votes
DELETE FROM tbl
WHERE ID NOT IN (
    SELECT MIN(ID)
    FROM tbl
    GROUP BY Name
)

2 commentaires

Juste pour mentionner, je ne t'ai pas répondu. Mais les identifiants sont également identiques pour des lignes en double. Pourtant,


Cela supprimera tous les enregistrements avec une pièce d'identité <> 1, et non de l'OP ayant besoin. (pas mon bowvote BTW).



9
votes

Utilisation d'un Row_Number dans un CTE vous permet de supprimer des valeurs dupliquées tout en conservant des lignes uniques.

WITH q AS (
  SELECT RN = ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID )
         , ID
         , Name
  FROM   ATable
)
DELETE FROM q WHERE RN > 1


0 commentaires

1
votes

lieven a raison ... Cependant, vous voudrez peut-être modifier le code de Lieven en ajoutant simplement une clause supérieure dans la déclaration de suppression comme celle-ci:

Supprimer le dessus (1) de q où rn> 1;

J'espère que cela aide


0 commentaires

1
votes

Vous pouvez utiliser cette requête:

delete a from
(select id,name, ROW_NUMBER() over (partition by id,name order by id) row_Count
from dup_table) a
where  a.row_Count >1


0 commentaires