In Ihre Abfrage haben Sie die Bedingung Grade.ID_Courses NOT IN ( SELECT ID_Courses FROM Evaluation WHERE NAME='JOHN' and Year=1), um Zeilen aus der Notentabelle herauszufiltern die in der Auswertungstabelle nicht mit denselben Werten für NAME und Jahr vorhanden sind. Wenn der Name „JOHN“ jedoch nicht in der Auswertungstabelle vorhanden ist, erzeugt die Abfrage keine Ausgabe.
Eine Einschränkung Der Hauptgrund für die Verwendung von NOT IN bei Unterabfragen ist die Anfälligkeit für Inkonsistenzen, wenn eine der Unterabfragen NULL-Werte enthält. Dies liegt daran, dass SQL eine dreiwertige Logik verwendet, wobei NULL einen unbekannten oder fehlenden Wert darstellt. Wenn NOT IN auf eine Unterabfrage angewendet wird, die möglicherweise NULL-Werte enthält, können die Ergebnisse unvorhersehbar oder falsch werden.
Um diese Probleme zu mildern , wird empfohlen, die Verwendung von NOT IN bei Unterabfragen zu vermeiden, die möglicherweise NULL-Werte enthalten. Stattdessen können zuverlässigere Alternativen wie NOT EXISTS oder explizite Joins verwendet werden.
Sie könnten Ihre Abfrage beispielsweise mit dem NOT EXISTS-Operator wie folgt umschreiben:
SELECT Grade.ID_Courses, Course.ID_Courses, Grade.NAME, Course.NAME, Grade.ID_Courses, Evaluation.NAME, Evaluation.Year, Grade.Year FROM Grade 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 Grade.Year = 1 AND Evaluation.NAME IS NULL;
Verwendung expliziter Joins anstelle der WHERE-Klausel, wie in der bereitgestellten Lösung vorgeschlagen, kann auch die Leistung und Lesbarkeit Ihrer Abfrage verbessern.
Das obige ist der detaillierte Inhalt vonWarum schlägt „NOT IN' von MySQL bei leeren Unterabfragen fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!