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
Lepaskan: 2024-12-30 03:08:10
asal
795 orang telah melayarinya

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';
Salin selepas log masuk

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)
Salin selepas log masuk
  1. Pindahkan keadaan c.foobar ke dalam predikat cantum:
LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'somethingelse'
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan