PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 09/11/2010 15:59:43

Gold.Strike
Membre

SOS requête imbriquée

Bonjour,

J'ai un soucis avec une requête imbriquée, qui pourtant me parait plutot simple...

Je ne sais pas si la solution consiste à utiliser un curseur, une fonction pl/sql ou une variable, mais je voudrais comparer un champ récupérer dans la requête "principale" avec un champ de la "sous-reuqête" : MonChampB.


select T1.X1 MonChampA, T1.X2 MonChampB
from Table1 T1
inner join Table2 T2 on T2.X1 = T1.X2
inner join Table3 T3 on T3.X1 = T2.X2
where T3.X3 in 
(select T10.X1
from Table10 T10
inner join Table11 T11 on T11.X1 = T10.X2
where T10.X3 = MonChampB)

Quelle est la solution?

Hors ligne

#2 09/11/2010 16:06:33

Marc Cousin
Membre

Re : SOS requête imbriquée

Quel est le problème, pour commencer ? Vous avez un message d'erreur ?


Marc.

Hors ligne

#3 09/11/2010 16:29:29

Gold.Strike
Membre

Re : SOS requête imbriquée

Bah l'erreur c'est tout simplement que la requête ne passe pas : le nom de la colonne n'est pas reconnue dans la sous-requête.

ERREUR: la colonne « MonChampB » n'existe pas

Hors ligne

#4 09/11/2010 16:43:01

Marc Cousin
Membre

Re : SOS requête imbriquée

MonChampB est le nom de colonne affiché dans le résultat de la requête. Ce n'est pas un alias que vous pouvez utiliser dans le subselect qui suit. Pas plus que dans la clause where par exemple.

Vous devez écrire :

select T1.X1 MonChampA, T1.X2 MonChampB
from Table1 T1
inner join Table2 T2 on T2.X1 = T1.X2
inner join Table3 T3 on T3.X1 = T2.X2
where T3.X3 in
(select T10.X1
from Table10 T10
inner join Table11 T11 on T11.X1 = T10.X2
where T10.X3 = T1.X2)


Marc.

Hors ligne

#5 09/11/2010 16:50:58

Gold.Strike
Membre

Re : SOS requête imbriquée

Oki d'accord merci, je comprends mieux...

En fait, ma requête serait plutot :

select T3.X3 MonChampA, T1.X2 MonChampB
from Table1 T1
inner join Table2 T2 on T2.X1 = T1.X2
inner join Table3 T3 on T3.X1 = T2.X2
where T3.X3 in 
(select T10.X1
from Table10 T10
inner join Table11 T11 on T11.X1 = T10.X2
where T10.X3 = T1.X2)

Mais je souhaiterais mettre à jour la colonne X1 de table T1, avec les valeurs récupérées dans T3.X3...
Cela est il faisable via une requête update?

Dernière modification par Gold.Strike (09/11/2010 16:56:11)

Hors ligne

#6 09/11/2010 17:12:41

Marc Cousin
Membre

Re : SOS requête imbriquée

C'est faisable avec une requête update (ce qui vous intéresse, vu que vous voulez obtenir les valeurs de T3, c'est la syntaxe
UPDATE T1 set T1.X1=T3.X3 FROM T2,T3
WHERE T2.X1 = T1.X2
AND T3.X1 = T2.X2
AND T3.X3 in
(select T10.X1
from Table10 T10
inner join Table11 T11 on T11.X1 = T10.X2
where T10.X3 = T1.X2)

Je ne l'ai évidemment pas testé, mais ça devrait marcher.


Marc.

Hors ligne

#7 09/11/2010 17:55:08

Gold.Strike
Membre

Re : SOS requête imbriquée

Hum je ne suis pas sur de m'être bien fait comprendre.
Ta syntaxe marche bien, mais ne valorise par la colonne T1.X1 comme je l'espérais!!

En effet, avec la requête SELECT précédente :

select T3.X3 MonChampA, T1.X2 MonChampB
from Table1 T1
inner join Table2 T2 on T2.X1 = T1.X2
inner join Table3 T3 on T3.X1 = T2.X2
where T3.X3 in 
(select T10.X1
from Table10 T10
inner join Table11 T11 on T11.X1 = T10.X2
where T10.X3 = T1.X2)

J'obtiens une valeur différente par ligne pour ma colonne T3.X3

Mais avec la requête UPDATE que tu m'as donné, tous les champs T1.X1 se retrouvent avec la même valeur après son exécution...

Ne faudrait il pas que je parte plutot sur une fonction pl/sql pour faire cette mise à jour?

Hors ligne

#8 09/11/2010 18:13:15

Marc Cousin
Membre

Re : SOS requête imbriquée

Cette requête donne quoi :

SELECT T1.X1,T3.X3 FROM T1,T2,T3
WHERE T2.X1 = T1.X2
AND T3.X1 = T2.X2
AND T3.X3 in 
(select T10.X1
from Table10 T10
inner join Table11 T11 on T11.X1 = T10.X2
where T10.X3 = T1.X2)

C'est celle équivalente à l'update (vieille syntaxe de jointure, on ne peut pas faire autrement avec la syntaxe d'update)

Dernière modification par Marc Cousin (09/11/2010 18:13:42)


Marc.

Hors ligne

Pied de page des forums