10
votes

Comment supprimer des lignes en double avec SQL?

J'ai une table avec des rangées. Chaque rangée a un champ de date. À l'heure actuelle, cela peut être duplicate d'une date. J'ai besoin de supprimer tous les doublons et de stocker uniquement la ligne avec le plus haut identifiant code>. Comment cela est-ce possible à l'aide d'une requête SQL?

MAINTENANT: P>

date      id
'07/07'   3
'07/05'   5

sql

1 commentaires

À partir des données que vous avez envoyées, vous vous retrouvez avec deux pas trois rangées! 07/05 est répété.


3 Réponses :


32
votes
DELETE FROM table WHERE id NOT IN
    (SELECT MAX(id) FROM table GROUP BY date);

6 commentaires

Wow, est-ce que je suis allé un chemin de rond-point ou quoi? C'est certainement le meilleur moyen de le faire.


Je pensais que votre chemin était un peu trop compliqué ... mais honnêtement, je voulais le faire d'abord en utilisant 3 requêtes au lieu de celui-ci.


Cette requête est également utile pour cette réponse: Sélectionnez la date, le compte (date) comme numomocurrences de groupe de table par date ayant (date (date)> 1)


@djangofan: Presque, vous devez simplement sélectionner ID au lieu de compter (date).


Cela ne fonctionnerait toutefois pas dans MySQL en raison de ses limitations stupides sur les sous-sélectionneurs.


En fonction de vos données, cette requête peut prendre beaucoup plus de temps que celle suggérée par IDDQD.



3
votes

Pour MySQL, PostgreSQL, Oracle Metter Way est auto-jointure. XXX

Agrégation SQL (Max, groupe par) Les fonctions sont presque toujours très lentes.


0 commentaires

6
votes

Je n'ai pas de droits de commentaire, alors voici mon commentaire comme une réponse au cas où n'importe qui apparaît dans le même problème:

dans SQLite3, il existe une clé primaire numérique implicite appelée "Rowid", de sorte que la même requête serait la même requête. ressemblent à ceci: xxx

Cela fonctionnera avec n'importe quelle table même s'il ne contient pas une colonne de clé primaire appelée "ID".


0 commentaires