2 Jointures Externes sur la Même Table?
Ici est une question qui a été ahurissant moi pour quelques jours maintenant, et j'ai cherché mais n'ai pas pu trouver aucune réponse convaincante !
Simple question, pourquoi est-il limité à 2 Jointures en SQL, sur la même table, même avec différentes colonnes utilisées, vérifier les requêtes ci-dessous pour mieux comprendre. Aussi, je peux les surmonter à l'aide de imbriquée sous-requête ou ANSI jointures, mais alors pourquoi il est encore restreint, en premier lieu, à l'aide de ( + ) - opérateur de!
Dans cette question, je me réfère à l'erreur :
ORA-01417: un tableau peut être externe joint d'au plus un autre tableau
Ce que je veux poser est pourquoi ce qui est permis :
select * from
a, b, c
where a.a1 = b.b1
and a.a2 = c.c1
Et pourquoi ce n'est pas permis:
select * from
a, b, c
where a.a1(+) = b.b1
and a.a2(+) = c.c1
Veuillez laisser ANSI et les sous-requêtes Imbriquées seul
inner
ou outer
) le même tableau autant de fois que nécessaire...@Sgeddes dit, vous êtes le plus susceptible confus. Il n'y a pas de "2 Jointures Externes" limite sur Oracle
Je crois que vous n'obtiendrez si vous êtes en train de faire un "vieux style" jointure externe à l'aide de la
(+)
de l'opérateur. Ne pas utiliser le (+)
opérateur - elle n'est pas portable, et pourrait bien être désapprouvée par Oracle. Au lieu de cela, utilisez un ANSI-style de JOINTURE EXTERNE GAUCHE pour effectuer vos jointures. Partager et d'en profiter.l'ancienne syntaxe pour les jointures externes (à l'aide de
(+)
) est obsolète et ne doit pas être utilisé plus longtemps.Ce n'est certainement pas recommandé, même par Oracle. Êtes-vous sûr que c'est déconseillé? Je ne peux pas trouver quelque chose dans l'Oracle docs à ce sujet.
OriginalL'auteur Shubham Gupta | 2013-06-14
Vous devez vous connecter pour publier un commentaire.
La restriction est décrit dans la documentation d'Oracle: Les Jointures Externes
ce qui signifie essentiellement (décrit dans la norme ANSI/ISO syntaxe) que vous ne pouvez pas avoir avec l'ancien
(+)
syntaxe ce qui est parfaitement valable dans la norme ANSI/ISO:ou:
C'est seulement une des nombreuses restrictions de l'ancien Oracle syntaxe.
Que pour les raisons de cette restriction, il peut être détails de mise en œuvre ou/et l'ambiguïté de ces jointures. Alors que les deux jointures ci-dessus sont 100% équivalent, la suite n'est pas équivalente pour les deux ci-dessus:
Voir le test dans SQL-Violon. Alors la question se pose. Comment le propriétaire joindre à être interprété, à la requête 1 ou 2?
Il n'y a aucune restriction si un tableau s'affiche sur le côté gauche de (2 ou plus), les jointures externes. Ces sont parfaitement valables, même avec l'ancienne syntaxe:
Cette restriction semble avoir été assouplies dans 12c
Lien vers cette? Je pense qu'ils devraient enlever le support pour l'ancienne syntaxe, pas de l'améliorer.
Le lien est https://docs.oracle.com/database/121/NEWFT/chapter12101.htm#NEWFT492 mais mon commentaire était basé sur mon expérience. J'ai 10g et 12c de bases de données ayant le même schéma et les données, d'une requête avec plusieurs (+) rejoint travaille en 12c, échoue dans 10g avec l'ORA-01417 d'erreur ci-dessus. Personnellement, je trouve l'ancienne syntaxe plus facile à digérer quand il y a plus d'un couple de tables jointes.
Intéressant! Pouvez-vous partager une idée ou pastebin avec une requête qui fonctionne dans 12c et échoue dans 10g? Je continue de penser que la proprietray syntaxe
(+)
pour les jointures externes est ambigu. Et je ne vois rien dans l'Oracle docs qu'ils ont résolu que.OriginalL'auteur ypercubeᵀᴹ
Je vous suggère fortement d'utiliser des
OUTER JOIN
de la syntaxe. À partir de Oracle 12c cette restriction est levée 1.4.3 Amélioré Natif Oracle Syntaxe de JOINTURE EXTERNE GAUCHE:Code:
De sortie:
db<>violon démo - Oracle 11g sera de retour d'erreur
db<>le violon de démonstration Oracle 12c/18c sera de retour resultset
OriginalL'auteur Lukasz Szozda