sql server 除法计算 sql除法-3.1 SQL实现除法
最编程
2024-08-12 07:19:58
...
我们需要求同时选了数学和语文的学生姓名,即狗蛋和翠花。
这里的同时其实描述的就是包含关系,即,语文和数学包含在学生的选课项目里面。
select distinct st1.stu_name
from student st1
where not exists (select 1
from subject sj1 --①
where sj1.SUBJECT_ID in ('M','C')
and not exists (select 1
from student st2
where st1.STU_NAME=st2.STU_NAME --②
and sj1.SUBJECT_ID=st2.SUBJECT_ID )); --③
可以看到执行计划是Filter嵌套Filter,性能好坏不能一概而论,只能说这种执行计划比较危险。
我们简单说一下运算方法(辅助理解,和运算顺序无关):
①处,我们先获得数学和语文的结果集;
②处,外层st1的学生姓名传给内层的st2学生姓名,获得学生选课的结果集
③处,①处取得的结果集和②处取得结果集用课程编号进行关联,此时,要求①处取得的结果集包含在②的结果集内,最外层的not exists才会返回数据。
上面的实现方式我感觉还是比较抽象的,我们现在先考虑用减运算改一下实现方式。
select distinct st1.stu_name
from student st1
where not exists (select sj1.SUBJECT_ID
from subject sj1
where sj1.SUBJECT_ID in ('M','C') --①
minus --③
select st2.SUBJECT_ID
from student st2
where st2.STU_NAME=st1.STU_NAME); --②
虽然少了一层Filter,性能貌似也没有好太多,还请大神在评论区留下更好的实现方法。
我们依然简单说一下运算方法,还是辅助理解,与运算顺序无关。
①处,我们获得语文和数学的结果集;
②处,内层学生表和外层学生表用学生姓名关联,获得学生选课信息结果集
③处,①和②取得的结果集进行减法运算,如果无数据返回,外层查询返回数据。
相比之下,这种写法更好理解。