Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL > Requêtes
Requêtes Forum d'entraide sur les requêtes SQL spécifiques à PostgreSQL, les triggers, les vues, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/07/2003, 11h21   #1
Membre à l'essai
 
Inscription : juin 2003
Messages : 32
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 32
Points : 22
Points : 22
Envoyer un message via ICQ à doohan
Par défaut [requête] DELETE + SELECT

Un petite question concernant une de mes requetes. Voilà le problème, lorsque que l'on veut faire un insert en postgresql on peut employer une syntaxe du type :
Code :
1
2
 
INSERT INTO table1_toto SELECT * FROM table2_toto;
Est-ce que vous savez si il existe une syntaxe equivalente pour les DELETE du style:
Code :
1
2
 
DELETE FROM table1_toto SELECT * FROM table2_toto;
Merci
doohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2003, 11h30   #2
Candidat au titre de Membre du Club
 
Inscription : mars 2003
Messages : 17
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 17
Points : 14
Points : 14
Je ne pense pas que cela soit possible et je n'en vois pas vraiment l'intéret !
En effet, si tu veux faire cela, c que les tables sont identiques ou qu'elles ont au moins une relation sur un champ.

Donc pourquoi ne pas faire simplement :
Code :
1
2
 
DELETE FROM table1_toto WHERE table1_toto.un_champ IN (SELECT table2_toto.un_champ FROM table2_toto);
Djouls64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2003, 11h37   #3
Membre à l'essai
 
Inscription : juin 2003
Messages : 32
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 32
Points : 22
Points : 22
Envoyer un message via ICQ à doohan
en fait j'ai deux tables de structure identique.
Dans l'une se trouve les enregistrements à effacer dans l'autre.
Mais je ne veux effacer un enregistrement que si TOUS les champs de l'enregistrement sont strictement identiques dans les deux bases (environs une centaine de champs).
Je trouvais que cette solution etait exactement ce que j'avais besoin.
Avec ta solution il faudrais que je fasse un IN sur la centaine de champs et je me demande si cela ne risque pas de prendre un temps très long (la base table1_toto contient 500 000 enregistrements et la base table2_toto 10 000).
Si tu penses qu'il y a une solution convenant peut etre mieux a mon problème avec ces renseignements supplémentaires...sinon je vais essayer ta solution avec les IN pour voir le temps d'exection.
doohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2003, 11h44   #4
Candidat au titre de Membre du Club
 
Inscription : mars 2003
Messages : 17
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 17
Points : 14
Points : 14
Je comprends mieux ton problème et c clair que ca risque d'etre lourd avec les 100 champs !

Mais j'ai du mal à comprendre pourquoi tu n'utilise pas de clés uniques pour tes tables, tu n'aurais à faire la jointure que sur un seul champ.
Djouls64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2003, 11h59   #5
Membre à l'essai
 
Inscription : juin 2003
Messages : 32
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 32
Points : 22
Points : 22
Envoyer un message via ICQ à doohan
oui bonne remarque et reponse très simple c'est que l'on vient de me donner à travailler sur une base de données sans clé unique [hourra!!!] donc pour moi le seul moyen pour identifier les enregistrements à effacer est de comparer tous les champs qui ne doivent pas changer et de les supprimer si tous les champs sont identiques...bref un gros casse-tete.
doohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2003, 12h18   #6
Candidat au titre de Membre du Club
 
Inscription : mars 2003
Messages : 17
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 17
Points : 14
Points : 14
Dans ce cas, la solution du IN est la seule qui me semble valable et je ne pense pas que ca prendra énormément de temps. Je crois que la clause IN est interprétée comme une succession de OR.

Donc ceci devrait marcher :

Code :
1
2
 
DELETE FROM table1 WHERE (champ_un, champ_deux, champ_trois ...) IN (SELECT * FROM table2);
Il y a peut etre un moyen d'optimiser la saisie des champs dans la première parenthèse,
sinon, bon courage
Djouls64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2003, 12h27   #7
Membre à l'essai
 
Inscription : juin 2003
Messages : 32
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 32
Points : 22
Points : 22
Envoyer un message via ICQ à doohan
merci pour tout je vais regarder tout ca.
doohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h30.


 
 
 
 
Partenaires

Hébergement Web