一个sql经典的题目,关于相关子查询

zf99613 2004-05-10 05:33:35
s
s# sname age sex
1 李强 23 男
2 刘丽 22 女
5 张友 22 男
c
c# cname teacher
k1 c语言 王华
k5 数据库 程军
k8 编译原理 程军
sc
s# c# grade
1 k1 83
2 k1 85
5 k1 92
2 k5 90
5 k5 84
5 k8 80
根据以上三个表求出:选修课程包含学号为2的学生所修课程的学生学号(s#)。
答案:
select s#
from sc sc1
where not exists
(select c#
from sc sc2
where s#=2 and not exists
(select *
from sc
where s#=sc1.s# and c#=sc2.c#)
)
请问:谁知道执行的结果应该是什么?(注意:没有distinct关键字)
关键是要详细说明处理过程。

...全文
104 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
internetcsdn 2004-05-11
  • 打赏
  • 举报
回复
mib3000(黑仔) ( ) 信誉:100 2004-05-10 21:03:00 得分:0


up.2


我UP.3
zjcxc 元老 2004-05-10
  • 打赏
  • 举报
回复
效率应该不会太低. exists是一种高效的查询方案.
loveweb 2004-05-10
  • 打赏
  • 举报
回复
这样的效率怎么样呢?
zjcxc 元老 2004-05-10
  • 打赏
  • 举报
回复
select s#
from sc sc1
where not exists
(select c#
from sc sc2
where s#=2 and not exists
(select *
from sc
where s#=sc1.s# and c#=sc2.c#)
)

你当查询当游标看待,逐条读记录,当读取第一条记录时,去判断条件中的子查询,看条件是否成立,如果条件成立,即该条记录生成到结果集中,如果条件不成立,则丢弃该记录
然后读第二第记录,同样判断条件.

这样相信你就能理解是怎么执行的了.
mib3000 2004-05-10
  • 打赏
  • 举报
回复
up.2
internetcsdn 2004-05-10
  • 打赏
  • 举报
回复
UP
outwindows 2004-05-10
  • 打赏
  • 举报
回复
以上运行结果:
2
5
2
5
5
-------------------------------------------------------------
-------------------------------------------------------------

"选修课程包含 学号为2的学生所修课程 的学生学号(s#)."
----------- --------------------- --------------
② ① ③
应该这样吧...
select s# from sc where c# in(select c# from sc where s#=2)
------------------------------^①学号为2的学生所修课程
------------------------^②选修课程包含...
-------^③学生学号...

结果:
-------------------------------------------------------------
1
2
5
2
5
8992026 2004-05-10
  • 打赏
  • 举报
回复
2
5
2
5
5
outwindows 2004-05-10
  • 打赏
  • 举报
回复
No.1

34,590

社区成员

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

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