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 15/12/2011, 14h14   #1
Membre du Club
 
Inscription : juin 2006
Messages : 241
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 241
Points : 40
Points : 40
Par défaut Update imbriqué avec un SELECT

Bonjour,
Je voudrais à l'aide d'une requête, mettre à jour les données d'une table pas l’intermédiaire d'une autre.
Code :
1
2
3
4
5
6
 
Table_a :
id_A
nom
prenom
Exemple : 1,toto,titi / 2, martin, philippe
Code :
1
2
3
4
5
6
 
table_b :
id_B
nom
prenom
Exemple : martin,philippe / toto, titi
Maintenant mon but est de mettre à jour l'id_B en recuperant les valeurs sur la table A et ayant le meme prenom et le meme nom.
Code :
1
2
 
UPDATE table_b SET id_B = x.id_A FROM (SELECT id_A FROM table_a WHERE table_a.nom = table_b.nom AND table_a.prenom = table_b.prenom) x
Cependant, ca ne fonctionne pas (la relation "table_a" n'existe pas).

Avez vous une idée ?
Merci
johnson95 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 14h24   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Bonjour,

Quelle est votre erreur en fait ?

Sinon, qu'allez-vous faire en cas de doublon ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 14h33   #3
Membre du Club
 
Inscription : juin 2006
Messages : 241
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 241
Points : 40
Points : 40
L'erreur est la suivante :
la relation "table_a" n'existe pas
johnson95 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 14h59   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Pouvez-vous poster le script de création exact de la table_a ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 15h05   #5
Membre du Club
 
Inscription : juin 2006
Messages : 241
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 241
Points : 40
Points : 40
Voila :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
CREATE TABLE table_a
(
  id_a serial NOT NULL,
  nom character varying(10),
  prenom character varying(80),
  CONSTRAINT table_a_pkey PRIMARY KEY (id_a ),
  CONSTRAINT table_a_nom_key UNIQUE (nom , prenom )
)
 
CREATE INDEX table_ac_nom_prenom_index
  ON table_a
  USING btree
  (nom , prenom );
 
 
CREATE TABLE table_b
(
  id_b integer,
  nom character varying(10),
  prenom character varying(80)
)
johnson95 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 15h10   #6
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
table_a qui n'existe pas, c'est peut-être qu'elle a été créée avec des majuscules et implicitement des guillemets autour (problème récurrent avec pgadmin et l'usage des majuscules)

Mais par ailleurs l'update corrélé est mal écrit. Ce serait plutôt:
Code :
UPDATE table_b SET id_B = id_A FROM table_a WHERE table_a.nom = table_b.nom AND table_a.prenom = table_b.prenom;
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/12/2011, 15h13   #7
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
oki bon,

j'ai un gros doute avec votre syntaxe d'update.
En v9.1 celle-ci plante et ca me parait logique.

Vous n'aurez pas de problème de doublon dû à votre contrainte d'unicité (mais pour moi c'est contrainte est incohérente).

Je ne comprend pas non plus le but de votre démarche vu que vous risquez d'avoir des problème de duplication de primary key dans la table_b, et encore pire si vous utilisez aussi un serial pour la pk de la table_b.

Bref, essayez avec cette syntaxe :
Code :
1
2
3
 
UPDATE table_b b SET idb = (SELECT ida FROM table_a a WHERE a.nom = b.nom AND table_a.prenom = table_b.prenom) 
WHERE EXISTS (SELECT 1 FROM table_a a WHERE a.nom = b.nom AND table_a.prenom = table_b.prenom);
edit : attention estofilo au risque d'update de idB avec des valeurs null vu qu'aucune restriction n'est faites
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 15h36   #8
Membre du Club
 
Inscription : juin 2006
Messages : 241
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 241
Points : 40
Points : 40
Citation:
Envoyé par estofilo Voir le message
table_a qui n'existe pas, c'est peut-être qu'elle a été créée avec des majuscules et implicitement des guillemets autour (problème récurrent avec pgadmin et l'usage des majuscules)

Mais par ailleurs l'update corrélé est mal écrit. Ce serait plutôt:
Code :
UPDATE table_b SET id_B = id_A FROM table_a WHERE table_a.nom = table_b.nom AND table_a.prenom = table_b.prenom;
Grand merci à vous !
Grâce a vous j'ai appris la bonne structure à utiliser et vous m'avez montré mon erreur !

Merci !
johnson95 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 16h39   #9
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
Citation:
Envoyé par johnson95 Voir le message
Voila :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
CREATE TABLE table_a
(
  id_a serial NOT NULL,
  nom character varying(10),
  prenom character varying(80),
  CONSTRAINT table_a_pkey PRIMARY KEY (id_a ),
  CONSTRAINT table_a_nom_key UNIQUE (nom , prenom )
)
 
CREATE INDEX table_ac_nom_prenom_index
  ON table_a
  USING btree
  (nom , prenom );
Une remarque là-dessus, dans le code ci-dessus le CREATE INDEX est à supprimer car le CREATE TABLE aura créé déjà implicitement un index unique sur (nom,prenom) du fait de la contrainte table_a_nom_key
Ce genre de création implicite est mentionnée sous la forme de "NOTICE" en retour du CREATE TABLE. Je ne sais pas si pgadmin les affiche par défaut (psql le fait en tout cas).
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2011, 09h21   #10
Membre du Club
 
Inscription : juin 2006
Messages : 241
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 241
Points : 40
Points : 40
Merci !
johnson95 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 05h11.


 
 
 
 
Partenaires

Hébergement Web