SQL Server-包含not exists 谓词的嵌套相关子查询
现有三个表:学生表S、课程表C和选课表SC,需要查询选修了全部课程的学生姓名。
| Sno |
| S1 |
| S2 |
| S3 |
| Cno |
| 01 |
| 02 |
| 03 |
| Sno | Cno |
| S1 | 01 |
| S1 | 02 |
| S1 | 03 |
| S2 | 01 |
| S2 | 03 |
| S3 | 02 |
| S3 | 03 |
题目可以转化为:查询这样的学生,没有一门课程是他不选的。
编写含有not exists 谓词的嵌套相关子查询代码如下:
select Sno from S --得到没有没选课的学生
where not exists ( select * from C --得到没选的课
where not exists ( select * from SC
where S.Sno = SC.Sno and C.Cno = SC.Cno))
代码执行过程可以通过下面的表格来理解:
| 第一层查询逐行向下传递S表的记录 | 第二层查询逐行向下传递C表的记录 | SC(第三层查询结果) | 第二个not exists 返回值 | 第二层查询结果 | 第一个not exists 返回值 | 第一层查询结果 |
|
S1 |
01 02 03 |
S1 01 S1 02 S1 03 |
返回假 返回假 返回假 |
没有结果 | 返回真 | Sno = 'S1' |
|
S2 |
01 02 03 |
S2 01 没有结果 S2 03 |
返回假 返回真 返回假 |
Cno = '02' | 返回假 | 没有结果 |
|
S3 |
01 02 03 |
没有结果 S3 02 S3 03 |
返回真 返回假 返回假 |
Cno = '03' | 返回假 | 没有结果 |

浙公网安备 33010602011771号