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 :
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
           )
     )
)
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é
Le message d'oracle est :
ORA-01799: une colonne ne peut pas être jointe extérieurement à une sous-requête.
J'ai bien entendu effectuer des recherches sur le net, une solution me paraissait intéressante :
Ne pas joindre directement TABLE1 mais joindre (SELECT * FROM TABLE1) :

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)
Cela fonctionne très bien.. quand on retire "AND t1.date<tabletierce3.date2" de la requête car sinon ORACLE retourne :
"tabletierce3.date2 : IDENTIFICATEUR NON VALIDE"
ce qui me semble tout à fait logique.

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