Secara efektif, WHERE
ketentuan dan JOIN
ketentuan untuk [INNER] JOIN
100% setara di PostgreSQL. (Ini adalah praktik yang baik untuk menggunakan JOIN
eksplisit> kondisi untuk membuat kueri lebih mudah dibaca dan dipelihara).
Hal yang sama adalah tidak benar untuk LEFT JOIN
digabungkan dengan WHERE
kondisi di atas meja di sebelah kanan gabungan. Tujuan dari LEFT JOIN
adalah untuk mempertahankan semua baris di sisi kiri gabungan, terlepas dari kecocokan di sisi kanan. Jika tidak ditemukan kecocokan, baris diperpanjang dengan NULL
nilai untuk kolom di sisi kanan. Panduan:
LEFT OUTER JOIN
Pertama, inner join dilakukan. Kemudian, untuk setiap baris di T1 yang tidak memenuhi kondisi bergabung dengan baris mana pun di T2, baris yang digabungkan ditambahkan dengan nilai nol di kolom T2. Jadi, tabel yang digabungkan selalu memiliki setidaknya satu baris untuk setiap baris di T1.
Jika Anda kemudian menerapkan WHERE
kondisi yang membutuhkan sesuatu selain NULL
nilai pada kolom tabel di sisi kanan, Anda membatalkan efek dan secara paksa mengubah LEFT [OUTER] JOIN
untuk bekerja seperti [INNER] JOIN
biasa , hanya (mungkin) lebih mahal karena rencana kueri yang lebih rumit.
Dalam kueri dengan banyak tabel yang digabungkan, Postgres (atau RDBMS apa pun) sulit untuk menemukan rencana kueri terbaik (atau bahkan bagus). Jumlah urutan yang mungkin secara teoritis untuk bergabung dengan tabel bertambah secara faktorial (!). Postgres menggunakan "Pengoptimal Kueri Umum" untuk tugas tersebut dan ada beberapa setelan untuk memengaruhinya.
Mengaburkan kueri dengan LEFT JOIN
yang menyesatkan sebagaimana diuraikan, membuat pekerjaan perencana kueri lebih sulit, menyesatkan pembaca manusia dan biasanya mengisyaratkan kesalahan dalam logika kueri.
Jawaban terkait untuk masalah yang berasal dari ini:
- Mengapa null sama dengan bilangan bulat di WHERE?
- Kueri dengan LEFT JOIN tidak mengembalikan baris untuk hitungan 0
- Kueri SQL menggunakan gabungan luar dan membatasi catatan anak untuk setiap induk
- Gabungan luar kiri bertindak seperti gabung dalam
- Pilih baris yang tidak ada di tabel lain
dll.