NOT EXISTS查询异常求助:无法正确筛选目标Class_List数据
现有数据表
Class_List表
| Class_List_id | Class_id |
|---|---|
| 341 | 4 |
| 342 | 4 |
Lesson_Class表
| Class_List_id | Lesson_id |
|---|---|
| 341 | 22 |
| 342 | 22 |
问题排查
你的SQL语句逻辑错误,导致NOT EXISTS子查询始终返回空集,最终外层查询返回所有Class_List记录,具体问题点:
- 子查询是独立执行的:你在子查询里重新关联了
Class_List和Lesson_Class,没有和外层的Class_List记录建立关联关系。当前数据中Lesson_Class不存在Lesson_id=21的记录,因此子查询结果为空。 NOT EXISTS(空集)会被判定为TRUE,所以外层查询会返回所有Class_List的记录,完全不符合预期。
正确的SQL语句
要实现需求,需在子查询中关联外层的Class_List记录,检查当前Class_List_id是否存在于Lesson_Class且满足Lesson_id=21,同时外层筛选Class_id=4的记录:
SELECT Class_List.Class_List_id FROM Class_List WHERE Class_List.Class_id = 4 AND NOT EXISTS ( SELECT 1 FROM Lesson_Class WHERE Lesson_Class.Class_List_id = Class_List.Class_List_id AND Lesson_Class.Lesson_id = 21 );
结果说明
根据现有数据,Lesson_Class中没有Lesson_id=21的记录,因此所有Class_id=4的Class_List_id(341、342)都会被返回——这符合需求,因为这些id都不存在于Lesson_Class的Lesson_id=21关联记录中。如果后续Lesson_Class新增Class_List_id=341且Lesson_id=21的记录,查询会仅返回342。
内容的提问来源于stack exchange,提问作者Observer
相关产品推荐
相关产品推荐

