Supprimer les doublons d'une table

Supprimer les doublons d'une table - SQL/NoSQL - Programmation

Marsh Posté le 28-07-2005 à 11:44:35    

Bonjour
Je cherche une maniere de supprimer les doublons contenus dans ma table:
 
Je pensais faire :

Code :
  1. delete from Tblnm where cle in (select cle from Tblnm group by Tblnm having count(cle)>1)


 
cependant le petit pb c'est que cette requette va m'effacer les deux occurences (ou plus) lorsqu'il y a doublon , alors que je veux pouvoir en garder une.
 
Merci
 
P.S: c'est pas moi qui fait des tables avec des doublons et sans PK

Reply

Marsh Posté le 28-07-2005 à 11:44:35   

Reply

Marsh Posté le 28-07-2005 à 12:00:16    

Tu dois pouvoir t'en tirer avec un rownum ou un oid, non?


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 28-07-2005 à 12:04:03    

ca donnerait truc du style
 

delete from table
where rownum in  
(
 select rownum from table t1
 where exists
 (
  select 1 from table t2
  where t1.rownum > t2.rownum
  and t1.id = t2.id
 )
)


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 28-07-2005 à 12:29:24    

le pb c'est que j'ai MySQL

Reply

Marsh Posté le 28-07-2005 à 12:31:28    

et ya pas de rownum ou d'oid ou une connerie du style sous mysql? :??:


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 28-07-2005 à 12:32:03    

et?
 
EDIT:  :D  grilled


Message édité par cesarr89 le 28-07-2005 à 12:32:35
Reply

Marsh Posté le 28-07-2005 à 12:36:57    

sinon, solution brutale :
créer une table temporaire, dans laquelle tu insères toute ta table sauf les lignes qui y sont déjà quand tu veux les insérer.
Et ensuite tu vides ta table, et tu rebascules le contenu de ta table temporaire...


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 28-07-2005 à 12:38:05    

erratum il y a bien une collone rowid sur MySQL
 
EDIT : en fait non y a pas


Message édité par betsamee le 28-07-2005 à 12:40:10
Reply

Marsh Posté le 28-07-2005 à 12:38:41    

Alors tout va bien!:D


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 28-07-2005 à 12:40:54    

Citation :


sinon, solution brutale :  
créer une table temporaire, dans laquelle tu insères toute ta table sauf les lignes qui y sont déjà quand tu veux les insérer.  
Et ensuite tu vides ta table, et tu rebascules le contenu de ta table temporaire...


 
c'est ce que j'ai fait mais c'est crade au possible

Reply

Marsh Posté le 28-07-2005 à 12:40:54   

Reply

Marsh Posté le 28-07-2005 à 12:42:15    

betsamee a écrit :

Citation :


sinon, solution brutale :  
créer une table temporaire, dans laquelle tu insères toute ta table sauf les lignes qui y sont déjà quand tu veux les insérer.  
Et ensuite tu vides ta table, et tu rebascules le contenu de ta table temporaire...


 
c'est ce que j'ai fait mais c'est crade au possible


ah ben ça j'ai pas dit le contraire...[:joce]
Mais quand on a pas le choix on fait avec ce qu'on a...[:skeye]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 28-07-2005 à 12:46:29    

Reply

Marsh Posté le 28-07-2005 à 13:46:39    

sympa le lien

Reply

Marsh Posté le 28-07-2005 à 14:07:07    

si tu passes par une table temporaire, fais un SELECT DISTINCT ... de la table de départ, histoire de ne pas avoir à vérifier dans la table d'arrivée.
 
Exemple:
 

Code :
  1. CREATE TABLE temp_table
  2. AS SELECT DISTINCT ...
  3. FROM table_depart;
  4. DELETE FROM table_depart;
  5. INSERT INTO table_depart
  6. SELECT * FROM temp_table;
  7. COMMIT;
  8. DROP TABLE temp_table;


Message édité par Beegee le 28-07-2005 à 14:07:21
Reply

Marsh Posté le 29-07-2005 à 01:38:10    

t'as pas une clé primaire ? si t'en a pas, tu peux toujours la  rajouter en spécifiant que tu utilises un numéro auto incrément, normalement ça marche.
 
t'as plus qu'à faire la requête avec le rownum mais en utilisant cette clé à la place, et ça devrait marcher. ensuite, tu peux virer cette clé primaire.

Reply

Marsh Posté le 29-07-2005 à 08:12:18    

Arjuna a écrit :

t'as pas une clé primaire ? si t'en a pas, tu peux toujours la  rajouter en spécifiant que tu utilises un numéro auto incrément, normalement ça marche.
 
t'as plus qu'à faire la requête avec le rownum mais en utilisant cette clé à la place, et ça devrait marcher. ensuite, tu peux virer cette clé primaire.


ah oui tiens, bonne idée, ça aussi, en cas de soucis!
Quelqu'un avait posé la même question sur blabla, sous sql server, et ne voyait pas d'autre solution que la table temporaire...celle-ci est probablement meilleure...


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 29-07-2005 à 10:14:41    

merci de votre aide
c'est bien ce que je pensais ; pas de solution qui tient en 1 requete
en fait c'est logique puisque les 2 tuples sont identiques donc impossible d'en isoler un des deux

Reply

Marsh Posté le 29-07-2005 à 10:15:16    

betsamee a écrit :

merci de votre aide
c'est bien ce que je pensais ; pas de solution qui tient en 1 requete
en fait c'est logique puisque les 2 tuples sont identiques donc impossible d'en isoler un des deux


euh.
Ma solution qui utilise le rownum te plait pas?:o


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 29-07-2005 à 11:16:08    

betsamee a écrit :

merci de votre aide
c'est bien ce que je pensais ; pas de solution qui tient en 1 requete
en fait c'est logique puisque les 2 tuples sont identiques donc impossible d'en isoler un des deux


en tout cas, une fois la table nettoyée, rajoute une PK sur ton champ, parceque c'est total n'importe quoi une table sans doublons différenciables.

Reply

Marsh Posté le 29-07-2005 à 12:10:22    

Citation :


euh.  
Ma solution qui utilise le rownum te plait pas?


elle est super mais pas de rownum avec MySQL finalement

Reply

Sujets relatifs:

Leave a Replay

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