Rumah >pangkalan data >tutorial mysql >Mengapa Cantuman Kiri Saya Bertindak Seperti Cantuman Dalam Apabila Menapis pada Lajur Jadual Kanan dalam Klausa WHERE?

Mengapa Cantuman Kiri Saya Bertindak Seperti Cantuman Dalam Apabila Menapis pada Lajur Jadual Kanan dalam Klausa WHERE?

DDD
DDDasal
2024-12-30 03:08:10811semak imbas

Why Does My Left Join Act Like an Inner Join When Filtering on the Right Table's Column in the WHERE Clause?

Teka-teki Sertai Kiri: Masa Sihir Apabila Ia Berubah Menjadi Gabungan Dalam

Dalam alam wizard pangkalan data, melakukan pengambilan data kompleks menggunakan cantuman kiri adalah amalan biasa. Walau bagaimanapun, kadangkala, cantuman kiri tidak berkelakuan seperti yang diharapkan.

Bayangkan pertanyaan berikut:

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';

Menariknya, apabila keadaan c.foobar diletakkan dalam klausa WHERE sebagai di atas, cantuman kiri nampaknya berubah menjadi cantuman dalam. Keputusan dikembalikan hanya jika kedua-dua kriteria a.foo dan c.foobar dipenuhi.

Mengapa metamorfosis? Kuncinya terletak pada klausa WHERE. Apabila nilai dari sebelah kanan cantuman kiri (sebelah kanan merujuk kepada jadual di sebelah kanan klausa ON) ditentukan dalam klausa WHERE, semua nilai NULL dibuang, dengan berkesan mengurangkan cantuman kiri kepada cantuman dalaman. Ringkasnya, jika c.foobar tidak terdapat dalam tableThree, pertanyaan tidak mengembalikan baris.

Untuk memintas kesusahan ini, terdapat dua pilihan:

  1. Pinda klausa WHERE untuk dipertimbangkan kedua-dua nilai sah dan NULL untuk c.foobar:
AND (c.foobar = 'somethingelse' OR c.foobar IS NULL)
  1. Pindahkan keadaan c.foobar ke dalam predikat cantum:
LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'somethingelse'

Memilih antara penyelesaian ini bergantung pada yang khusus keperluan pertanyaan. Walau bagaimanapun, memahami gelagat asas cantuman kiri dengan kehadiran klausa WHERE adalah penting untuk menguasai teknik mendapatkan data.

Atas ialah kandungan terperinci Mengapa Cantuman Kiri Saya Bertindak Seperti Cantuman Dalam Apabila Menapis pada Lajur Jadual Kanan dalam Klausa WHERE?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn