Prawidłowa składnia jest używanie nawiasów w klauzula łączenia w FROM
, a nawiasy do mieć wpływ.
Rozważ to zapytanie:
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;
Nawiasy pozwalają na wewnętrzne łączenie tabel b
i c
a następnie dołączyć na zewnątrz do a
.
Bez nawiasów próba wyrażenia tego jako sprzężenia lewego byłaby niemożliwa. Albo nie otrzymasz wierszy 11-30 z tabeli a
lub wiersze 11-20 tabeli c
byłoby null
s (w zależności od tego, jak próbowałeś to zrobić).
Zauważ, że powyższe zapytanie jest równoważne z:
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;
, który nie wymaga nawiasów. Więc jeśli naprawdę chcesz uniknąć używania nawiasów w FROM
klauzuli, zazwyczaj możesz to zrobić. Osobiście wolę LEFT JOIN
metoda z nawiasami zamiast RIGHT JOIN
.