Vous n'êtes pas identifié(e).
Pages : 1
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
Quel est le problème, pour commencer ? Vous avez un message d'erreur ?
Marc.
Hors ligne
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
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
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
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
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
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
Pages : 1