首页 > 代码库 > 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
View Code

根据这个不假思索就毛糙的写了下面的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 
View Code

测试数据查询结果如下:

不就是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
View Code

根据这个分析就有了最终的结果

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 
View Code

 

这样就对了。示例说明的表和数据是临时添加的,不涉及实际开发所设计真实数据。只是为了说明问题。当然,这只是由于本人的知识浅薄的原因,例子举得不是很恰当。大虾看了,请指正其中不当之处,也好帮助我学习进步,谢谢!