Det er lovlig syntaks at bruge parentes i en join-klausul i en FROM , og parenteserne gør have en effekt.
Overvej denne forespørgsel:
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;
Parentesen giver dig mulighed for at lave en indre sammenføjning af tabeller b og c og derefter outer join det til a .
Uden parentesen ville det være umuligt at forsøge at udtrykke det som en venstreforbindelse. Du ville heller ikke få rækker 11-30 fra tabel a ellers rækker 11-20 i tabel c ville være null s (afhængig af hvordan du forsøgte at gøre det).
Bemærk, at ovenstående forespørgsel svarer til:
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;
, som ikke kræver parentes. Så hvis du virkelig vil undgå at bruge parenteser i FROM klausul, kan du normalt gøre det. Personligt foretrækker jeg LEFT JOIN metode med parenteser i stedet for en RIGHT JOIN .