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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top