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
.