首页 > 代码库 > T-SQL之LEFT JOIN您真的了解了吗?
T-SQL之LEFT JOIN您真的了解了吗?
在上一篇T-SQL之JOIN关键字详解我对JOIN关键字做了简单的剖析。那么在实际应用中根据需求,多表之间的JOIN是在所难免的。下面就我在项目中遇到过的关于JOIN关键字的使用的相关经历再一次做下自我总结,以备日后回顾和查看。
先来看用于此次总结用的数据库表间关系,如下所示:
现在开始我们的需求,要找出这样的Student:Student的Major(专业是可以为多个的)至少有一个或它本身没有专业要求和指定的School的所含的某个Major(专业也是可以为多个的且至少含一个)是相匹配的(此处暂时不考虑Score分数)。
初一看:这还不简单嘛,于是直接写出了下面的T-SQL语句(下面的是查询结果):
SELECT * FROM Student S JOIN StudentMajor SM ON S.StudentID=SM.StudentID LEFT JOIN ( SELECT S.*,SM.MajorID FROM School S JOIN SchoolMajor SM ON S.SchoolID=SM.SchoolID WHERE S.SchoolID=1 ) AS SCM_TEMP ON SM.MajorID=SCM_TEMP.MajorID
根据这个不假思索就毛糙的写了下面的T-SQL:
SELECT * FROM Student S JOIN StudentMajor SM ON S.StudentID=SM.StudentID LEFT JOIN ( SELECT S.*,SM.MajorID FROM School S JOIN SchoolMajor SM ON S.SchoolID=SM.SchoolID WHERE S.SchoolID=1 ) AS SCM_TEMP ON SM.MajorID=SCM_TEMP.MajorID WHERE SM.MajorID IS NULL OR SCM_TEMP.MajorID IS NOT NULL
测试数据查询结果如下:
不就是Student联合StudentMajor查询出来作为一个集合然后与School和SchoolMajor查询出来的数据集合进行一次LEFT JOIN左联表查询么?
结果我忽略了一点就是上面需求的高亮部分。也就是这种情况没有把Student表中没有任何专业要求的给筛选出来。再看下面的代码以及执行结果:
SELECT * FROM Student S LEFT JOIN StudentMajor SM ON S.StudentID=SM.StudentID LEFT JOIN ( SELECT S.*,SM.MajorID FROM School S JOIN SchoolMajor SM ON S.SchoolID=SM.SchoolID WHERE S.SchoolID=1 ) AS SCM_TEMP ON SM.MajorID=SCM_TEMP.MajorID
根据这个分析就有了最终的结果
SELECT * FROM Student S LEFT JOIN StudentMajor SM ON S.StudentID=SM.StudentID LEFT JOIN ( SELECT S.*,SM.MajorID FROM School S JOIN SchoolMajor SM ON S.SchoolID=SM.SchoolID WHERE S.SchoolID=1 ) AS SCM_TEMP ON SM.MajorID=SCM_TEMP.MajorID WHERE SM.MajorID IS NULL OR SCM_TEMP.MajorID IS NOT NULL
这样就对了。示例说明的表和数据是临时添加的,不涉及实际开发所设计真实数据。只是为了说明问题。当然,这只是由于本人的知识浅薄的原因,例子举得不是很恰当。大虾看了,请指正其中不当之处,也好帮助我学习进步,谢谢!
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。