[SQL] Supprimer les tuples en doubles dans une table

Supprimer les tuples en doubles dans une table [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 06-03-2007 à 16:29:46    

Hello !
 
J'ai des entrées en double dans une table (un dictionnaire de plus de 13000 mots, donc plus de 13000 tuples).
 
J'ai fais une requête pour sélectionner les mots en double :
 
SELECT m1.mot
FROM dico m1
WHERE m1.mot = (SELECT m2.mot
                         FROM dico m2
                         WHERE m1.id != m2.id);
 
Voilà en gros, c'est tout d'abord pour tester si ça fonctionne bien mais le PC plante, (peut être parce qu'il doit vérifier 13000² données soit 169 000 000).
 
Ou ma requête ne convient peut-être pas ?
 
Merci pour vos lumières si vous en avez !

Reply

Marsh Posté le 06-03-2007 à 16:29:46   

Reply

Marsh Posté le 06-03-2007 à 16:53:14    

J'aurais utilisé un exists

Code :
  1. select d1.mot from dico d1 where exists ( select m2.mot from dico m2 where m1.id!=m2.id and m1.mot = m2.mot)


Mais tu peux également le faire avec une jointure de dico sur elle même.

 

Edit: Ah et si ça rame toujours vérifie tes indexs sur mot et id.


Message édité par anapajari le 06-03-2007 à 16:53:49
Reply

Marsh Posté le 06-03-2007 à 17:03:33    

Euh si mot était la clef primaire ça n'aurai pas été plus simple ? :o
 
Sinon :

Code :
  1. delete from dico where (select count(*) from dico group by mot) > 1;


 
Enfin c'est pas ça mais tu vois le debut de piste.


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 06-03-2007 à 17:14:15    

Fallait déjà que je rentre tout ça dans une BD et fallait que je passe par un id parce qu'il y a des mots en double pour l'instant.
 
anapajari, ta reqeête n'est toujours pas finie après 10 minutes, je pense que c'est la même chose que moi, il y en a pour des heures !

Reply

Marsh Posté le 06-03-2007 à 17:20:17    

Et le group by mot :??: en principe si le SGBD est pas mauvais et qu'il y a des bon index ca doit pas mettre 50 ans pour faire un group by.
 
Sinon requete correlee :

Code :
  1. select d1.mot from dico d1 where (select count(*) from dico d2 where d1.mot = d2.mot) > 1;


 
:D


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 06-03-2007 à 17:53:07    

MEI a écrit :

Euh si mot était la clef primaire ça n'aurai pas été plus simple ? :o
Sinon :

Code :
  1. delete from dico where (select count(*) from dico group by mot) > 1;




C'est vrai que y'aurait plus de doublons ... remarque y'aurait même plus de mots :o

 
Fused a écrit :

Fallait déjà que je rentre tout ça dans une BD et fallait que je passe par un id parce qu'il y a des mots en double pour l'instant.
anapajari, ta reqeête n'est toujours pas finie après 10 minutes, je pense que c'est la même chose que moi, il y en a pour des heures !


T'as vérifié les indexs? t'as fait un reorg sur les tables? tes statistiques sont à jour? C'est quel sgbd?
Que tu aies une idée, la même requete sur une table d'une base db2 chez nous ( nb total d'enregistrements : 942426) met moins de 2 secondes ( 1.96 pour être précis).

 


edit: par contre c'est vrai que si tu as pas besoin d'identifier les ids à supprimer il suffit d'un petit:

Code :
  1. select nom, count(*) from dico group by nom having count(*)>1


Message édité par anapajari le 06-03-2007 à 17:54:24
Reply

Marsh Posté le 06-03-2007 à 18:04:08    

moi perso, si le cas unique, (je veux dire si tu veux simplement supprimer une seule fois tout les mots pour repartir avec une table "propre" ) je ferai betement un script qui recopie l'ancienne table dans une nouvelle; avec un ptit test en + au passage.

Reply

Marsh Posté le 08-03-2007 à 15:29:31    

effectivement :
 
insert into newtable (select distinct mot from oldtable);
 
avec newtable contenant un champ ID auto-incrément

Reply

Marsh Posté le 08-03-2007 à 15:45:08    

Bon compromis ça ! Merci ! Ca marche niquel comme ça !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed