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' | 返回假 | 没有结果 |