Bonjour à toutes et à tous,
Quelqun pourrait-il me dire dans quel cas et pourquoi oracle plante quand on remplace INNER par OUTER?
Exemple :
TABLE1 : clef primaire a, b et date
requête :
Les tables tierces sont bien entendu des table jointes ds la requête avant le OUTER JOIN et tabletierce 1, 2 et 3 l'alias que je leur ai donné
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 SELECT.. .. .. OUTER JOIN TABLE1 t1 ON ( t1.a=tabletierce1.a AND t1.b=tabletierce2.b AND t1.date= ( select max(t2.date) from TABLE1 t2 WHERE ( t1.a=t2.a AND t1.b=t2.b AND t1.date<tabletierce3.date2 ) ) )
Le message d'oracle est :
J'ai bien entendu effectuer des recherches sur le net, une solution me paraissait intéressante :ORA-01799: une colonne ne peut pas être jointe extérieurement à une sous-requête.
Ne pas joindre directement TABLE1 mais joindre (SELECT * FROM TABLE1) :
Cela fonctionne très bien.. quand on retire "AND t1.date<tabletierce3.date2" de la requête car sinon ORACLE retourne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 LEFT OUTER JOIN (SELECT * FROM TABLE1 B WHERE B.date IN ( SELECT MAX (date) FROM TABLE1 D WHERE (D.a = B.a and D.b = B.b) ) ) C ON (tabletierce1.a = C.a AND tabletierce1.b = C.b)ce qui me semble tout à fait logique."tabletierce3.date2 : IDENTIFICATEUR NON VALIDE"
J'ai bien trouvé une solution en utilisant les fonctions analytique et le group by et order by mais j'aimerais éviter d'écrire un sac de nœuds.
Et puis surtout cela me frustre de ne pas comprendre pourquoi oracle plante sur cette syntaxe alors que remplacer INNER par OUTER revient à rajouter les lignes qui ne matchent pas!
Peut être en faisant un union d'un INNER et d'un ANTI INNER mais cela fait également sac de nœuds.
Alors si vous avez des solutions, des réponses, des conseils, des recommandations je vous écouterais attentivement.
Merci
Partager