Oracle
 sql >> Database >  >> RDS >> Oracle

Le parentesi nidificate nella clausola FROM sono sintassi Oracle SQL valida?

È sintassi legale usare le parentesi in una clausola di unione in un FROM e le parentesi do avere effetto.

Considera questa domanda:

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;

Le parentesi consentono di eseguire un inner join delle tabelle b e c e poi outer uniscilo a a .

Senza le parentesi, cercare di esprimerlo come un join sinistro sarebbe impossibile. Non otterresti le righe 11-30 dalla tabella a oppure le righe 11-20 della tabella c sarebbe null s (a seconda di come hai provato a farlo).

Tieni presente che la query precedente equivale 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;

, che non richiede parentesi. Quindi se vuoi davvero evitare di usare le parentesi nel FROM clausola, di solito puoi farlo. Personalmente, preferisco il LEFT JOIN metodo con parentesi invece di un RIGHT JOIN .