T-SQL之LEFT JOIN您真的了解了吗?
时间:2014-05-12 08:34:12
收藏:0
阅读:419
在上一篇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
这样就对了。示例说明的表和数据是临时添加的,不涉及实际开发所设计真实数据。只是为了说明问题。当然,这只是由于本人的知识浅薄的原因,例子举得不是很恰当。大虾看了,请指正其中不当之处,也好帮助我学习进步,谢谢!
评论(0)