34,590
社区成员
发帖
与我相关
我的任务
分享
select * from SC
where not exists ( select *
from SC C
where sc . c# = C. c#
and 'S1'= c. s# )
这部分代码 的意思:选出 所有选修了 S1 学员未选修 的课程
例如:
S2 C1
S3 C1
S3 C3
S4 C1
S4 C3
=================================================================
select * from SC
where not exists ( select *
from SC C
where sc . c# = C. c#
and 'S1'= c. s# )
and SC.S# =‘S2'
这部分代码意思是: 选出 S2学员 选修了 S1 学员未选修 的课程
例如:S2 C1
========================================================================
select *
from sc a
where not exists ( select *
from SC
where not exists ( select *
from SC C
where sc . c# = C. c#
and a . s# = c. s# )
and SC . s# = 'S2'
)
第三部分代码的是意思其实就一条一条记录去判断是否符合要求:
如果存在 S2学员选修了课程而该学员没选修,就剔除。
不知道 这样解释,大神们看看是否可以?
WITH CTE AS(
SELECT C# FROM SC WHERE sc . s# = 'S2'
)
,CTE2 AS(
SELECT S#,C# FROM s,cte
)
,CTE3 AS(
SELECT A.S# FROM CTE2 A LEFT JOIN SC B ON A.C#=B.C# AND A.S#=B.S# WHERE B.S# IS NULL GROUP BY A.S#
)
SELECT A.* FROM SC A LEFT JOIN CTE3 B ON A.S#=B.S# WHERE B.S# IS NULL
SELECT * FROM SC
WHERE S# in(select S# from
(SELECT S#,COUNT(S#) as counts FROM (select S# from sc as a
where c# IN
(SELECT C# FROM Sc WHERE S#='S2')) as p
group by S#) as t
where t.counts=(select count(C#) from Sc where S#='S2'))
我看了性能还差一点,大概是我的57%,你的43%,这个好理解一点。
先找出所有学习了S2学习的课程。然后算出各个学生的学习了S2学习的课程的数量。
如果这个数量等于S2学习的课程数量(这里就是2)那么他肯定满足条件。如果小于肯定不满足。select *
from SC
where not exists ( select *
from SC C
where sc . c# = C. c#
and a . s# = c. s# )
and SC . s# = 'S2'
这里面别名a,也就是最外面的表,只带入了s#,也就是sc的所有学生,我们先取第一条记录的学生's1',带入理解,即成了
select *
from SC
where not exists ( select *
from SC C
where sc . c# = C. c#
and 's1' = c. s# )
and SC . s# = 'S2'
而这句,很明显的意思是,查询所有在学生s2的课程中,没有学生s1也在学习的课程
如果这个查询有值,那么,这个查询的not exists不成立,那最外面的别名为a的第一记录的学生's1'不成立
因此整体语句的意思即是
在别名a的表中的所有学生里,不存在( 学生S2有学的课程,而他(别名a的学生)没有学习的课程)
不知这样有没有说清楚~~