Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Os parênteses aninhados na cláusula FROM são sintaxe Oracle SQL válida?


É uma sintaxe legal usar parênteses em uma cláusula de junção em um FROM , e os parênteses fazem tem um efeito.

Considere esta consulta:
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;

Os parênteses permitem que você faça uma junção interna das tabelas b e c e, em seguida, junte isso a a .

Sem os parênteses, tentar expressar isso como uma junção à esquerda seria impossível. Você também não obteria as linhas 11-30 da tabela a ou então as linhas 11-20 da tabela c seria null s (dependendo de como você tentou fazer isso).

Observe que a consulta acima é equivalente a:
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;

, que não requer parênteses. Portanto, se você realmente deseja evitar o uso de parênteses no FROM cláusula, você geralmente pode fazê-lo. Pessoalmente, prefiro o LEFT JOIN método com parênteses em vez de um RIGHT JOIN .