W rzeczywistości WHERE
warunki i JOIN
warunki dla [INNER] JOIN
są w 100% równoważne w PostgreSQL. (Dobrą praktyką jest użycie jawnego JOIN
warunki ułatwiające czytanie i obsługę zapytań).
To samo nie true dla LEFT JOIN
w połączeniu z WHERE
warunek na stole po prawej stronie sprzężenia. Cel LEFT JOIN
jest zachowanie wszystkich wierszy po lewej stronie sprzężenia, niezależnie od dopasowania po prawej stronie. Jeśli nie zostanie znalezione żadne dopasowanie, wiersz jest rozszerzany o NULL
wartości dla kolumn po prawej stronie. Instrukcja:
LEFT OUTER JOIN
Najpierw wykonywane jest sprzężenie wewnętrzne. Następnie dla każdego wiersza w T1, który nie spełnia warunku sprzężenia z żadnym wierszem w T2, dodawany jest połączony wiersz z wartościami null w kolumnach T2. Tak więc połączone tabele zawsze mają co najmniej jeden wiersz na każdy wiersz w T1.
Jeśli następnie zastosujesz WHERE
warunek, który wymaga czegoś innego niż NULL
wartość w kolumnach tabel po prawej stronie, unieważniasz efekt i wymuszasz konwersję LEFT [OUTER] JOIN
działać jak zwykły [INNER] JOIN
, po prostu (prawdopodobnie) drożej ze względu na bardziej skomplikowany plan zapytań.
W zapytaniu z wieloma połączonymi tabelami Postgres (lub dowolny RDBMS) jest trudny do znalezienia najlepszego (lub nawet dobrego) planu zapytań. Liczba teoretycznie możliwych sekwencji do łączenia tabel rośnie czynnikowo (!). Postgres używa do tego zadania „Generic Query Optimizer” i istnieją pewne ustawienia, które mają na to wpływ.
Zaciemnianie zapytania za pomocą wprowadzającego w błąd LEFT JOIN
jak wspomniano, utrudnia pracę planerowi zapytań, wprowadza w błąd czytelników i zazwyczaj wskazuje na błędy w logice zapytań.
Powiązane odpowiedzi na problemy wynikające z tego:
- Dlaczego null równa się liczba całkowita w WHERE?
- Zapytanie z LEFT JOIN nie zwraca wierszy dla liczby 0
- Kwerenda SQL wykorzystująca sprzężenie zewnętrzne i ograniczenie rekordów podrzędnych dla każdego rodzica
- Lewe sprzężenie zewnętrzne działające jak sprzężenie wewnętrzne
- Wybierz wiersze, których nie ma w innej tabeli
Itd.