Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
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 09/08/2006, 09h52   #1
Membre du Club
 
Avatar de wwave
 
Inscription : avril 2004
Messages : 189
Détails du profil
Informations personnelles :
Âge : 30

Informations forums :
Inscription : avril 2004
Messages : 189
Points : 52
Points : 52
Par défaut DELETE à partir d'un select

Bonjour,

J'ai 2 tables qui représentent des rues. L'une correspond au temps n (table1) et l'autre au temps n+1 (table2). Je veux supprimer de la table2 toutes les rues qui sont déjà dans la table1.
J'ai commencé par ajouter aux 2 tables une colonne (checksum) qui concatène toutes les autres.

Je voudrais exécuter une requête telle que
DELETE table2.* FROM table1, table2 WHERE table1.checksum=table2.checksum;
Mais il me dit "syntax error" car je ne peux faire que DELETE FROM ....

Je pense du coup à écrire une fonction qui me mettrait dans une table les checksum qui apparaissent dans les 2 tables
CREATE TABLE checksumArray(checksum text);
SELECT table2.checksum INTO checksumArray FROM table1, table2 WHERE table1.checksum=table2.checksum;
et faire une sorte de boucle :
for(i=0;i<checksumArray.size;i++)
DELETE FROM table2 WHERE checksum = checksumArray[i];

Celà est-il possible ?
Merci d'avance de votre aide !

WwAvE
wwave est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2006, 10h21   #2
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
Salut,

Deux possibilités selon moi :
Code :
1
2
DELETE FROM table2
  WHERE checksum IN (SELECT t1.checksum FROM table1 t1);
Cette syntaxe est standard il me semble.

Sinon, il y a aussi possibilité de faire une jointure :
Code :
1
2
DELETE FROM table2 t2 USING table1 t1
  WHERE t2.checksum = t1.checksum;
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2006, 10h25   #3
Membre du Club
 
Avatar de wwave
 
Inscription : avril 2004
Messages : 189
Détails du profil
Informations personnelles :
Âge : 30

Informations forums :
Inscription : avril 2004
Messages : 189
Points : 52
Points : 52
Je connaissais pas le USING... parce que j'avais aussi essayer avec le select mais j'ai des tables qui sont ENORMES et du coup le processus était beaucoup trop long....
Merci !!!
wwave est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2006, 14h06   #4
Invité régulier
 
Inscription : août 2005
Messages : 21
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 21
Points : 9
Points : 9
à quoi sert le USING ?
magdalena est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2006, 14h16   #5
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
Dans ce cas, à faire une jointure pour déterminer les enregistrements à supprimer.

Voir l'exemple et l'explication en fin de cette page : http://www.postgresql.org/docs/8.1/i...ql-delete.html
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2006, 14h29   #6
Invité régulier
 
Inscription : août 2005
Messages : 21
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 21
Points : 9
Points : 9
Citation:
Envoyé par Biglo
Dans ce cas, à faire une jointure pour déterminer les enregistrements à supprimer.

Voir l'exemple et l'explication en fin de cette page : http://www.postgresql.org/docs/8.1/i...ql-delete.html
C'est plus efficace que :
DELETE FROM table2 t2, table1 t1
WHERE t2.checksum = t1.checksum;
magdalena 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 00h29.


 
 
 
 
Partenaires

Hébergement Web