Rumah > pangkalan data > tutorial mysql > Sertai Kiri lwn. Sertai Dalam: Bagaimanakah Klausa WHERE Mempengaruhi Keputusan Sertaan Kiri?

Sertai Kiri lwn. Sertai Dalam: Bagaimanakah Klausa WHERE Mempengaruhi Keputusan Sertaan Kiri?

DDD
Lepaskan: 2025-01-03 18:53:44
asal
1071 orang telah melayarinya

Left Join vs. Inner Join: How Does a WHERE Clause Affect a Left Join's Results?

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

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:

  1. 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)
    Salin selepas log masuk

    Ini membenarkan baris dengan c.foobar adalah NULL untuk disertakan dalam set hasil.

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

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!

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