Oracle
 sql >> Base de données >  >> RDS >> Oracle

Les parenthèses imbriquées dans la clause FROM sont-elles une syntaxe Oracle SQL valide ?

C'est une syntaxe légale d'utiliser des parenthèses dans une clause de jointure dans un FROM , et les parenthèses do avoir un effet.

Considérez cette requête :

WITH table_a AS ( SELECT rownum id FROM DUAL CONNECT BY LEVEL <= 30),
     table_b as ( SELECT rownum id FROM DUAL CONNECT BY LEVEL <= 20),
     table_c AS ( SELECT rownum id FROM DUAL CONNECT BY LEVEL <= 10)
SELECT a.id, b.id, c.id
FROM   table_a a left join ( table_b b inner join table_c c ON c.id = b.id ) ON b.id = a.id 
ORDER BY 1,2,3;

Les parenthèses permettent de faire une jointure interne des tables b et c puis jointure externe à a .

Sans la parenthèse, essayer d'exprimer cela comme une jointure gauche serait impossible. Vous n'obtiendriez pas non plus les lignes 11 à 30 de la table a ou bien les lignes 11-20 du tableau c serait null s (selon la façon dont vous avez essayé de le faire).

Notez que la requête ci-dessus est équivalente à :

WITH table_a AS ( SELECT rownum id FROM DUAL CONNECT BY LEVEL <= 30),
     table_b as ( SELECT rownum id FROM DUAL CONNECT BY LEVEL <= 20),
     table_c AS ( SELECT rownum id FROM DUAL CONNECT BY LEVEL <= 10)
SELECT a.id, b.id, c.id
FROM   table_b b inner join table_c c on c.id = b.id right join table_a a on a.id = b.id 
ORDER BY 1,2,3;

, qui ne nécessite pas de parenthèse. Donc, si vous voulez vraiment éviter d'utiliser des parenthèses dans le FROM clause, vous pouvez généralement le faire. Personnellement, je préfère le LEFT JOIN méthode avec des parenthèses au lieu d'un RIGHT JOIN .