欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

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 ));  --③

sql server 除法计算 sql除法_数据_02

可以看到执行计划是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);  --②

sql server 除法计算 sql除法_数据_03

虽然少了一层Filter,性能貌似也没有好太多,还请大神在评论区留下更好的实现方法。

我们依然简单说一下运算方法,还是辅助理解,与运算顺序无关。

①处,我们获得语文和数学的结果集;

②处,内层学生表和外层学生表用学生姓名关联,获得学生选课信息结果集

③处,①和②取得的结果集进行减法运算,如果无数据返回,外层查询返回数据。

相比之下,这种写法更好理解。