SQL Server-包含not exists 谓词的嵌套相关子查询

现有三个表:学生表S、课程表C和选课表SC,需要查询选修了全部课程的学生姓名。

S
Sno
S1
S2
S3
C
Cno
01
02
03
SC
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'  返回假  没有结果

 

posted @ 2022-05-03 19:15  Khru  阅读(180)  评论(0编辑  收藏  举报