Left Join vs. Inner Join
Dalam SQL, left join dan inner join ialah dua jenis cantuman asas yang menghasilkan set hasil yang berbeza. Cantuman kiri mengembalikan semua baris dari jadual kiri dan memadankan baris dari jadual kanan berdasarkan syarat cantum. Jika tiada padanan ditemui, nilai yang hilang dalam jadual kanan diwakili sebagai NULL. Sebaliknya, cantuman dalam hanya mengembalikan baris yang memenuhi syarat cantuman, tidak termasuk baris daripada kedua-dua jadual yang tidak memenuhi syarat itu.
Pengubahsuaian Gelagat Sertai Kiri
Dalam pertanyaan SQL yang disediakan:
SELECT a.foo b.bar c.foobar FROM tableOne AS a INNER JOIN tableTwo AS b ON a.pk = b.fk LEFT JOIN tableThree AS c ON b.pk = c.fk WHERE a.foo = 'something' AND c.foobar = 'somethingelse'
Kehadiran WHERE c.foobar = Klausa 'somethingelse' selepas syarat LEFT JOIN mempunyai kesan yang mengejutkan. Nampaknya untuk menukar cantuman kiri menjadi cantuman dalam, menyebabkan tiada baris dikembalikan jika 'sesuatu yang lain' tidak terdapat dalam jadualTiga.
Penjelasan
Ini nampaknya ganjil tingkah laku timbul daripada susunan penilaian pernyataan SQL. Klausa WHERE diproses selepas cantuman dilakukan. Oleh itu, apabila c.foobar = 'somethingelse' dinyatakan dalam klausa WHERE, ia secara berkesan menapis semua baris dari gabungan kiri dengan c.foobar adalah NULL. Akibatnya, hanya baris yang c.foobar sepadan dengan nilai yang ditentukan ('somethingelse') dikekalkan dalam set hasil akhir.
Penyelesaian
Untuk mengekalkan yang diingini gelagat join kiri, terdapat dua pilihan:
Ubah suai klausa WHERE untuk memasukkan ATAU c.foobar ADALAH NULL, seperti yang ditunjukkan di bawah:
WHERE a.foo = 'something' AND (c.foobar = 'somethingelse' OR c.foobar IS NULL)
Ini membenarkan baris dengan c.foobar adalah NULL untuk disertakan dalam set hasil.
Alihkan perbandingan c.foobar = 'sesuatu yang lain' ke dalam klausa HIDUP pada gabungan kiri, pastikan hanya baris yang memenuhinya syarat disertakan dalam set hasil:
LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'somethingelse'
Atas ialah kandungan terperinci Sertai Kiri lwn. Sertai Dalam: Bagaimanakah Klausa WHERE Mempengaruhi Keputusan Sertaan Kiri?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!