Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
966 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL] Supprimer les tuples en doubles dans une table

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[SQL] Supprimer les tuples en doubles dans une table

n°1524520
Fused
Posté le 06-03-2007 à 16:29:46  profilanswer
 

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 !

mood
Publicité
Posté le 06-03-2007 à 16:29:46  profilanswer
 

n°1524538
anapajari
s/travail/glanding on hfr/gs;
Posté le 06-03-2007 à 16:53:14  profilanswer
 

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
n°1524549
MEI
|DarthPingoo(tm)|
Posté le 06-03-2007 à 17:03:33  profilanswer
 

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 |
n°1524573
Fused
Posté le 06-03-2007 à 17:14:15  profilanswer
 

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 !

n°1524584
MEI
|DarthPingoo(tm)|
Posté le 06-03-2007 à 17:20:17  profilanswer
 

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 |
n°1524683
anapajari
s/travail/glanding on hfr/gs;
Posté le 06-03-2007 à 17:53:07  profilanswer
 

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
n°1524703
Nico5779
Posté le 06-03-2007 à 18:04:08  profilanswer
 

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.

n°1525863
MagicBuzz
Posté le 08-03-2007 à 15:29:31  profilanswer
 

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

n°1525881
Fused
Posté le 08-03-2007 à 15:45:08  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL] Supprimer les tuples en doubles dans une table

 

Sujets relatifs
VBA access requete SQL et fonction()[PHP] Supprimer les 5 denrières lignes d'un fichier
Trigger SQL server 2005[RESOLU]Requêtes SQL ds un script...
Equivalent SQL de mysql_affected_rows ()[PHP] supprimer contenu d'une table mysql
[RAD&FORMULAIRE] Générer un formulaire depuis une base/tableEffectuer une recherche > Requete SQL?
[SQL Server] Se connecter en admin sans le mot de passe 
Plus de sujets relatifs à : [SQL] Supprimer les tuples en doubles dans une table


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR