Les périls de "NOT IN" dans les requêtes SQL
Lors de la tentative d'une requête qui vérifie si les données d'une table n'existent pas dans une autre , l'opérateur "NOT IN" peut conduire à des résultats inattendus, notamment lors de la gestion de valeurs nulles.
Le problème avec "NOT IN" IN"
Dans la requête fournie, la clause "NOT IN" compare les résultats d'une sous-requête à la colonne "ID_Courses" de la table "Grade" :
Grade.ID_Courses NOT IN (SELECT ID_Courses FROM Evaluation WHERE NAME='JOHN' and Year=1)
Si la sous-requête renvoie des valeurs nulles, la clause "NOT IN" sera évaluée comme fausse, même si l'enregistrement "JOHN" spécifié avec "Année" 1 existe dans le Tableau « Note ». En effet, la logique à trois valeurs dans SQL interprète null comme « inconnu », ce qui conduit à une évaluation incorrecte.
Alternatives à « NOT IN »
Pour éviter ce problème , il est recommandé d'utiliser des méthodes alternatives telles que NOT EXISTS ou des jointures explicites :
NOT EXISTS
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
Jointures explicites
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
En utilisant ces alternatives, vous pouvez vous assurer que la requête identifie avec précision les enregistrements dans lesquels les données spécifiées ne sont pas existent dans l'autre table, quelle que soit la présence de valeurs nulles.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!