在您的查询中,您已包含条件 Grade.ID_Courses NOT IN ( SELECT ID_Courses FROM Evaluation WHERE NAME='JOHN' and Year=1) 以过滤掉成绩表中的行评估表中不存在具有相同名称和年份值的项目。但是,当评估表中不存在名称“JOHN”时,查询不会产生输出。
一个限制在子查询中使用 NOT IN 的一个原因是,当子查询之一包含 NULL 值时,它容易出现不一致。这是因为 SQL 采用三值逻辑,其中 NULL 表示未知或缺失值。当 NOT IN 应用于可能包含 NULL 值的子查询时,结果可能会变得不可预测或不正确。
缓解这些问题,建议避免对可能包含 NULL 值的子查询使用 NOT IN。相反,可以使用更可靠的替代方案,例如 NOT EXISTS 或显式联接。
例如,您可以使用 NOT EXISTS 运算符重写查询,如下所示:
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;
使用显式联接正如所提供的解决方案中所建议的,代替 WHERE 子句还可以提高查询的性能和可读性。
以上是为什么 MySQL 的'NOT IN”会因空子查询而失败?的详细内容。更多信息请关注PHP中文网其他相关文章!