SQL语言中含exists谓语的双层相关子查询如何理解?

qq_35847338 2021-02-16 11:14:11
各位好,请问一下SQL语言中含exists谓语的双层相关子查询如何理解?
我看了很久,被绕晕了,感觉很难理解,应该怎么去理解会比较清晰?2

列出至少学过98030101号同学学过所有课程的同学的学号
Select DISTINC S# From SC SC1
Where not exists
(Select * From SC SC2
Where SC2.S#='98030101'and not exists
(Select * From SC
Where C#=SC2.C# and S#=SC1.S#));
谢谢了!!
...全文
202 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_35847338 2021-02-19
  • 打赏
  • 举报
回复
引用 3 楼 锟斤拷锟斤拷 的回复:
Select * From SC SC2 Where SC2.S#='98030101'and not exists (Select * From SC Where C#=SC2.C# and S#=SC1.S#) 就是要这段查询结果为空呗(给这个查询命名为查询1,结果命名为结果1),这个select要满足两个条件,一个是S#='98030101',另一个是 Select * From SC Where C#=SC2.C# and S#=SC1.S# 的查询结果为空(给这个查询命名为查询2,结果命名为结果2)。 其中SC2.C#是对980同学选修的课程号的遍历,SC1.S#是所有不同学号的遍历。 有点foreach的感觉 就像这样: foreach 学号 in 所有不同学号集 foreach 课程 in 980同学选秀的课程集 如果有某行的S#字段值和C#字段值与遍历到的“学号”和“课程”相同,结果2就不为空了,也就不满足查询1的查询条件,也就是说这一行就不会出现在结果1里了。如果某个学号拥有结果1的所有C#,那结果1就是空的,这个学号就满足整个查询的条件了 。。。说的乱七八糟的我还是举例吧,比如980同学选修了001、002、003这三门课,那根据查询1的第一个条件就只会查出这三行,然后对这三行的C#,也就是001、002、003逐一判断满不满足查询1的第二个条件,在判断中对select distinct S#的每个S#进行逐一判断,也就是执行查询2:判断这个S#是否拥有这个C#,如果拥有,那么结果1里就会少一行记录。如果这个S#同时拥有001、002、003,那么结果1就是空的,这个S#就满足了主查询的条件 好像是这个样子
好的,太感谢了,我仔细看一看。
qq_35847338 2021-02-19
  • 打赏
  • 举报
回复
引用 4 楼 appo_li 的回复:
绕这么多的路,不如join where判断了
我是初学者,看的合工大老师的课,老师讲的很轻松,我看很久看不懂。一层还能看懂,两层嵌套太饶了,我理不清思路![face]monkey2:019.png[/face]
appo_li 2021-02-19
  • 打赏
  • 举报
回复
绕这么多的路,不如join where判断了
锟斤拷锟斤拷 2021-02-18
  • 打赏
  • 举报
回复
Select * From SC SC2 Where SC2.S#='98030101'and not exists (Select * From SC Where C#=SC2.C# and S#=SC1.S#) 就是要这段查询结果为空呗(给这个查询命名为查询1,结果命名为结果1),这个select要满足两个条件,一个是S#='98030101',另一个是 Select * From SC Where C#=SC2.C# and S#=SC1.S# 的查询结果为空(给这个查询命名为查询2,结果命名为结果2)。 其中SC2.C#是对980同学选修的课程号的遍历,SC1.S#是所有不同学号的遍历。 有点foreach的感觉 就像这样: foreach 学号 in 所有不同学号集 foreach 课程 in 980同学选秀的课程集 如果有某行的S#字段值和C#字段值与遍历到的“学号”和“课程”相同,结果2就不为空了,也就不满足查询1的查询条件,也就是说这一行就不会出现在结果1里了。如果某个学号拥有结果1的所有C#,那结果1就是空的,这个学号就满足整个查询的条件了 。。。说的乱七八糟的我还是举例吧,比如980同学选修了001、002、003这三门课,那根据查询1的第一个条件就只会查出这三行,然后对这三行的C#,也就是001、002、003逐一判断满不满足查询1的第二个条件,在判断中对select distinct S#的每个S#进行逐一判断,也就是执行查询2:判断这个S#是否拥有这个C#,如果拥有,那么结果1里就会少一行记录。如果这个S#同时拥有001、002、003,那么结果1就是空的,这个S#就满足了主查询的条件 好像是这个样子
吉普赛的歌 版主 2021-02-18
  • 打赏
  • 举报
回复
引用 1 楼 Mr_Nice 的回复:
使用ctrl+L,看执行计划
楼主希望你给他讲下逻辑, 不是什么计划。
Mr_Nice 2021-02-18
  • 打赏
  • 举报
回复
使用ctrl+L,看执行计划

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧