supprimer les doublons de lignes en fonction d'une valeur de colonne
J'ai le tableau ci-dessous et maintenant j'ai besoin de supprimer les lignes qui sont des doublons de "refIDs" mais avoir atleast une ligne avec cette ref, j'.e j'ai besoin de supprimer la ligne 4 et 5. merci de m'aider sur ce
+----+-------+--------+--+
| ID | refID | data | |
+----+-------+--------+--+
| 1 | 1023 | aaaaaa | |
| 2 | 1024 | bbbbbb | |
| 3 | 1025 | cccccc | |
| 4 | 1023 | ffffff | |
| 5 | 1023 | gggggg | |
| 6 | 1022 | rrrrrr | |
+----+-------+--------+--+
Utilisation min() et max() la fonction
Reportez-vous à la question suivante stackoverflow.com/questions/18932/...
Voulez-vous dire que vous souhaitez sélectionner des lignes, mais excluent les rangs 4 et 5, ou voulez-vous vraiment supprimer de votre table?
Cette question peut être un doublon de quelque chose, mais il est marqué MySQL et le référencés question ont utilisé la syntaxe SQL Server.
J'ai besoin de les supprimer
Reportez-vous à la question suivante stackoverflow.com/questions/18932/...
Voulez-vous dire que vous souhaitez sélectionner des lignes, mais excluent les rangs 4 et 5, ou voulez-vous vraiment supprimer de votre table?
Cette question peut être un doublon de quelque chose, mais il est marqué MySQL et le référencés question ont utilisé la syntaxe SQL Server.
J'ai besoin de les supprimer
OriginalL'auteur Jeyaprakash | 2015-02-10
Vous devez vous connecter pour publier un commentaire.
Ceci est similaire à Gordon Linoff de la requête, mais sans la sous-requête:
Il utilise une jointure interne pour supprimer uniquement les lignes où il y a une autre ligne avec le même refID mais la baisse des ID.
L'avantage d'éviter une sous-requête est d'être capable d'utiliser un index pour la recherche. Cette requête devrait bien performer avec un index multi-colonne sur refID + ID.
OriginalL'auteur Marcus Adams
Je ferais:
critères est refId est parmi les doublons et l'ID est différent de la min(id) de la duplique. Il serait mieux si refId est indexé
autrement et à condition que vous pouvez effectuer plusieurs fois la requête suivante jusqu'à ce qu'il ne supprime rien
OriginalL'auteur NJ73
De MySQL, vous pouvez le faire avec un
join
dansdelete
:Pour chaque
RefId
, la sous-requête qui calcule le minimum de laid
colonne (présumé être unique sur l'ensemble de la table). Il utilise unleft join
pour le match, donc tout ce qui ne correspond pas a unNULL
valeur pourtokeep.id
. Ce sont ceux qui sont supprimés.OriginalL'auteur Gordon Linoff
Certains une autre variante, dans certains cas, un peu plus rapide que Marcus et NJ73 réponses:
Espère que cela va aider quelqu'un. Sur de grandes tables Marcus réponse stands.
OriginalL'auteur user2501323