Die Gefahren von „NOT IN“ in SQL-Abfragen
Beim Versuch einer Abfrage, die prüft, ob Daten aus einer Tabelle in einer anderen nicht vorhanden sind , kann der „NOT IN“-Operator zu unerwarteten Ergebnissen führen, insbesondere bei der Verarbeitung von Nullwerten.
Das Problem mit „NOT IN“
In der bereitgestellten Abfrage vergleicht die „NOT IN“-Klausel die Ergebnisse einer Unterabfrage mit der Spalte „ID_Courses“ in der Tabelle „Grade“:
Grade.ID_Courses NOT IN (SELECT ID_Courses FROM Evaluation WHERE NAME='JOHN' and Year=1)
Wenn die Unterabfrage Nullwerte zurückgibt, wird die „NOT IN“-Klausel als „false“ ausgewertet, selbst wenn der angegebene „JOHN“-Datensatz mit „Jahr“ 1 in der vorhanden ist Tabelle „Noten“. Dies liegt daran, dass die dreiwertige Logik in SQL Null als „unbekannt“ interpretiert, was zu einer falschen Auswertung führt.
Alternativen zu „NOT IN“
Um dieses Problem zu vermeiden , wird empfohlen, alternative Methoden wie NOT EXISTS oder explizite Joins zu verwenden:
NOT EXISTIERT
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
Explizite Verknüpfungen
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
Durch die Verwendung dieser Alternativen können Sie sicherstellen, dass die Abfrage Datensätze genau identifiziert, bei denen die angegebenen Daten dies nicht tun in der anderen Tabelle vorhanden sind, unabhängig vom Vorhandensein von Nullwerten.
Das obige ist der detaillierte Inhalt vonWarum NOT EXISTS oder explizite Verknüpfungen anstelle von NOT IN in SQL-Abfragen verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!