Supprimer des lignes en double d'une table
-
20-08-2019 - |
Question
J'ai dans ma base de données une table contenant des enregistrements en double que je souhaite supprimer. Je ne veux pas créer une nouvelle table avec des entrées distinctes pour cela. Ce que je veux, c'est supprimer les entrées en double de la table existante sans créer de nouvelle table. Y a-t-il un moyen de le faire?
id action
L1_name L1_data
L2_name L2_data
L3_name L3_data
L4_name L4_data
L5_name L5_data
L6_name L6_data
L7_name L7_data
L8_name L8_data
L9_name L9_data
L10_name L10_data
L11_name L11_data
L12_name L12_data
L13_name L13_data
L14_name L14_data
L15_name L15_data
voir ce sont tous mes champs:
L'identifiant est unique pour chaque ligne.
L11_data est unique pour le champ d'action respectif.
L11_data a le nom de la société alors que l'action a le nom du secteur.
Donc, dans mes données, j'ai un nom en double des sociétés dans L11_data pour leurs industries respectives.
Ce que je veux, c’est avoir un nom unique et d’autres données des entreprises du secteur particulier stockées en action. J'espère avoir exposé mon problème de manière à ce que vous puissiez le comprendre.
La solution
Oui, en supposant que vous disposiez d'un champ d'identifiant unique, vous pouvez supprimer tous les enregistrements identiques, à l'exception de l'identifiant, mais sans "identifiant minimum". pour leur groupe de valeurs.
Exemple de requête:
DELETE FROM Table
WHERE ID NOT IN
(
SELECT MIN(ID)
FROM Table
GROUP BY Field1, Field2, Field3, ...
)
Notes:
- J'ai choisi librement "Table". et " ID " en tant que noms représentatifs
- La liste des champs ("Champ1, Champ2, ...") doit inclure tous les champs sauf l'ID
- Cela peut être une requête lente en fonction du nombre de champs et de lignes, mais je pense que ce serait bien comparé aux alternatives
EDIT: au cas où vous n’auriez pas d’index unique, ma recommandation est simplement d’ajouter un index unique auto-incrémental. Principalement parce que c'est un bon design, mais aussi parce que cela vous permettra d'exécuter la requête ci-dessus.
Autres conseils
ALTER IGNORE TABLE 'table' ADD UNIQUE INDEX(your cols);
Les doublons deviennent NULL, vous pouvez les supprimer
DELETE
FROM table_x a
WHERE rowid < ANY (
SELECT rowid
FROM table_x b
WHERE a.someField = b.someField
AND a.someOtherField = b.someOtherField
)
WHERE (
a.someField,
a.someOtherField
) IN (
SELECT c.someField,
c.someOtherField
FROM table_x c
GROUP BY c.someField,
c.someOtherField
HAVING count(*) > 1
)
Dans la requête ci-dessus, la combinaison de someField et de someOtherField doit identifier les doublons de manière distincte.