É 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
.