Bahaya "TIDAK MASUK" dalam Pertanyaan SQL
Apabila mencuba pertanyaan yang menyemak sama ada data dari satu jadual tidak wujud dalam yang lain , pengendali "TIDAK MASUK" boleh membawa kepada hasil yang tidak dijangka, terutamanya apabila mengendalikan null nilai.
Masalah dengan "TIDAK MASUK"
Dalam pertanyaan yang disediakan, klausa "TIDAK MASUK" membandingkan hasil subkueri dengan lajur "ID_Courses" dalam jadual "Gred":
Grade.ID_Courses NOT IN (SELECT ID_Courses FROM Evaluation WHERE NAME='JOHN' and Year=1)
Jika subquery mengembalikan sebarang nilai nol, "NOT Klausa IN" akan dinilai kepada palsu, walaupun rekod "JOHN" yang ditentukan dengan "Tahun" 1 wujud dalam jadual "Gred". Ini kerana logik tiga nilai dalam SQL mentafsir null sebagai "tidak diketahui," yang membawa kepada penilaian yang salah.
Alternatif kepada "TIDAK MASUK"
Untuk mengelakkan masalah ini , adalah disyorkan untuk menggunakan kaedah alternatif seperti TIDAK WUJUD atau gabungan eksplisit:
TIDAK WUJUD
SELECT Grade.ID_Courses, Course.ID_Courses, Grade.NAME, Course.NAME, Grade.ID_Courses, Evaluation.NAME, Evaluation.Year, Grade.Year from Grade LEFT JOIN Course ON Grade.ID_Courses=Course.ID_Courses LEFT JOIN Evaluation ON Grade.NAME=Evaluation.NAME AND GRADE.YEAR = Evaluation.YEAR WHERE Grade.NAME='JOHN' and Evaluation.NAME IS NULL GROUP BY Grade.ID_Courses
Gabungan Eksplisit
SELECT Grade.ID_Courses, Course.ID_Courses, Grade.NAME, Course.NAME, Grade.ID_Courses, Evaluation.NAME, Evaluation.Year, Grade.Year from Grade LEFT JOIN Course ON Grade.ID_Courses=Course.ID_Courses LEFT JOIN Evaluation ON Grade.NAME=Evaluation.NAME AND GRADE.YEAR = Evaluation.YEAR WHERE Grade.NAME='JOHN' and NOT (Evaluation.NAME IS NOT NULL) GROUP BY Grade.ID_Courses
Dengan menggunakan alternatif ini, anda boleh memastikan bahawa pertanyaan mengenal pasti rekod dengan tepat di mana data yang dinyatakan tidak wujud dalam jadual lain, tanpa mengira kehadiran nilai nol.
Atas ialah kandungan terperinci Mengapa Gunakan NOT EXISTS atau Explicit Joins Daripada NOT IN dalam Pertanyaan SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!