嵌套NOT EXISTS

zhunanhui 2007-04-10 04:42:02
有个学生学号\选修课程对应表SC(SNO,CNO),现在查询至少选修了学生95002选修的课程的学生学号,实现的SQL是这样的:
SELECT * FROM SC A
WHERE NOT EXISTS( SELECT * FROM SC B WHERE B.SNO=95002 AND
NOT EXISTS
(SELECT * FROM SC C WHERE C.CNO=B.CNO AND C.SNO=A.SNO))
谁能帮忙读懂!!!
...全文
470 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhunanhui 2007-04-12
  • 打赏
  • 举报
回复
谢谢中国风大哥,您解释得很清晰,这样把数据一拆分就很明了了,给的另外一种方式也正确,而且更加容易理解,我在网上查过这类问题都没给出合理的解释.谢谢啦.
中国风 2007-04-11
  • 打赏
  • 举报
回复
create table sc(SNO varchar(20), CNO varchar(20), 成绩 int)
insert sc select '001', 'english', 80
union all select '001', 'chinese', 70
union all select '002', 'english', 75
union all select '002', 'chinese', 90
union all select '002', 'english1', 85
union all select '003', 'chinese', 80
union all select '004', 'english', 80
union all select '004', 'china', 80

也可以为in,楼主要的结果用判断直假的方式效率好:

select * from sc where sno in(
select SNO from sc a where cno in(select cno from sc where SNO='001')
group by SNO
having count(1)=(select count(1) from sc where SNO='001'))

--举例说明楼主的语句
SELECT * FROM sc A
WHERE NOT EXISTS
(
SELECT * FROM sc B WHERE B.SNO='001'
AND
NOT EXISTS
(SELECT * FROM sc C WHERE C.CNO=B.CNO AND C.SNO=A.SNO)
)

not exists--条件为假时成立
扫描第一条记录时条件为:

SELECT * FROM sc B WHERE B.SNO='001'
AND
NOT EXISTS
(SELECT * FROM sc C WHERE C.CNO=B.CNO AND C.SNO='001')--为假成立,所有C.SNO=001的都成立
当C.SNO='002';

SELECT * FROM sc B WHERE B.SNO='001'
AND
NOT EXISTS
(SELECT * FROM sc C WHERE C.CNO=B.CNO AND C.SNO='002')--为假成立,所有C.SNO=002的都成立
当C.SNO='003';

SELECT * FROM sc B WHERE B.SNO='001'
AND
NOT EXISTS
(SELECT * FROM sc C WHERE C.CNO=B.CNO AND C.SNO='003')--有一条记录显示为真不成立
/*

SNO CNO 成绩
-------------------- -------------------- -----------
001 english 80

(所影响的行数为 1 行)*/

当C.SNO='004';
SELECT * FROM sc B WHERE B.SNO='001'
AND
NOT EXISTS
(SELECT * FROM sc C WHERE C.CNO=B.CNO AND C.SNO='004')--有一条记录显示为真不成立
/*
SNO CNO 成绩
-------------------- -------------------- -----------
001 chinese 70

(所影响的行数为 1 行)*/

zhunanhui 2007-04-10
  • 打赏
  • 举报
回复
题的意思是:学生95002选修了一部分课程,假如是1,2,3,查询出至少选修课程跟这位学生相同的学生学号.假设学生95003选修了1,2,3,4,那该学生学号就得查出来.哈哈,题目为了简洁,我说的有点拗口
中国风 2007-04-10
  • 打赏
  • 举报
回复
楼主要的结果是?

95002选修了1,2,3课程
查出与这个学生选修的课程完全相同的记录?还是
zhunanhui 2007-04-10
  • 打赏
  • 举报
回复
谢谢,好像不行吧.假如95002选修了1,2,3课程,95003只选了1号课程,那你的SQL会把95003也查询出来.
中国风 2007-04-10
  • 打赏
  • 举报
回复
改一下:
SELECT * FROM SC A
WHERE
EXISTS
(SELECT 1 FROM SC C WHERE C.CNO=A.CNO AND C.SNO=95002 )
--去掉一个AND C.SNO=A.SNO
中国风 2007-04-10
  • 打赏
  • 举报
回复
SELECT * FROM SC A
WHERE EXISTS
(SELECT 1 FROM SC C WHERE C.CNO=S.CNO AND C.SNO=A.SNO and C.SNO=95002 )
中国风 2007-04-10
  • 打赏
  • 举报
回复
--此语名效率差

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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