引言

  上一篇博客我们介绍了交叉联接,内联接,外联接3种基本的联接操作。这一篇文章我们介绍一些特殊的联接操作。

组合联接

  组合联接就是联接条件涉及到联接两边的多个列的查询。当需要根据主键-外键关系来联接两个表时,而且主外键关系是组合的。这时候就需要使用组合联接。下面咱们来看一个例子:

  例如:我们现在有两张表T1,T2。假设T2表上我们定义了外键(C1,C2),这个外键引用了T1表中的C1和C2列。现在需要写一个根据主外键关系来联接两个表的查询语句。如下:

 from dbo.Table1 as T1
inner join dbo.Table2 as T2
on T1.C1=T2.C1
and T1.C2=T2.C2

  在这个例子中,我们看到使用组合联接时,对于外键C1,C2我们使用了AND关键字将两个列组合起来进行匹配。

不等联接

  如果联接条件只包含等号运算符,这样的联接叫等值联接。如果联接条件包含除等号运算符以外的其他运算符,这样的联接叫做不等联接。我们下面来看一下一个例子:

  现在有一张表Emplyees,里面有9条数据,我们对这张表进行自联接,并且使用不等联接,看会输出什么结果。

 select E1.empid,E1.lastname,E1.firstname,
E2.empid,E2.lastname,E2.firstname
from HR.Employees as E1
inner join HR.Employees as E2
on E1.empid<E2.empid
order by E1.empid

  我们看相关结果:

  我们看到,对于empid为1的用户,输出的E2表中的empid是2-9的,对于empid为2的用户,输出的E2表中的empid是3-9的。E1表中的每一行都会去比对E2表中的全部记录,然后将E2表中符合条件的行筛选出来即可。如果觉得这个过程很难理解,我们可以使用小数据量来模拟这个过程。假设现在Employees表只存在3条数据,那么内连接的第一个步骤是生成笛卡尔积。我们来看生成的笛卡尔积是这样的:

  我们看到,如果Employees表里面只有3条数据,对表进行自联接就会生成9条数据。然后我们加上E1.empid<E2.empid这个筛选条件,我们发现最终留下来的就3条数据。如图:

  相信通过这个详细的分析,大伙一定很了解这其中的步骤了吧。

多表联接

  一个表运算符只对两个表进行操作,而一条查询语句可以包含多个联接。当FROM子句中包含多个表运算符时,表运算符在逻辑上是按照从左往右的顺序进行处理的。也就是说第一个表运算符的结果将作为第二个表运算符的输入,第二个表运算符的结果将作为第三个表运算符的输入,以此类推。注意:当处理交叉联接或者内连接时,数据库引擎经常对联接顺序进行内部的调整,但是这样的优化会确保不会对结果产生影响。

  下面我们通过例子来看一个这方面的内容:

  假设我们现在需要查询出每一个客户的订单以及订单的详细情况。通过对三张表进行联接操作。它们分别是Customer、Orders、OrderDetails表。看下面的SQL语句:

 select C.custid,C.companyname,O.orderid,
OD.productid,OD.qty
from Sales.Customers as C
inner join Sales.Orders as O
on C.custid=O.custid
inner join Sales.OrderDetails as OD
on O.orderid=OD.orderid

  我们看到,第一个联接我们联接了Customers表和Orders表。这一步联接获取的结果是每一个客户的订单信息。然后将这一步的结果再与OrderDetails表进行联接操作。最后得出每一个客户的订单详细情况。

浅谈T-SQL中的特殊联结的更多相关文章

  1. 转: 浅谈C/C++中的指针和数组(二)

    转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组 ...

  2. 转:浅谈C/C++中的指针和数组(一)

    再次读的时候实践了一下代码,结果和原文不一致 error C2372: 'p' : redefinition; different types of indirection 不同类型的间接寻址 /// ...

  3. 转载 浅谈C/C++中的static和extern关键字

    浅谈C/C++中的static和extern关键字 2011-04-21 16:57 海子 博客园 字号:T | T   static是C++中常用的修饰符,它被用来控制变量的存贮方式和可见性.ext ...

  4. 浅谈C语言中的强符号、弱符号、强引用和弱引用

    摘自http://www.jb51.net/article/56924.htm 浅谈C语言中的强符号.弱符号.强引用和弱引用 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2014- ...

  5. 浅谈关于QT中Webkit内核浏览器

    关于QT中Webkit内核浏览器是本文要介绍的内容,主要是来学习QT中webkit中浏览器的使用.提起WebKit,大家自然而然地想到浏览器.作为浏览器内部的主要构件,WebKit的主要工作是渲染.给 ...

  6. 浅谈JAVA GUI中,AWT与Swing的区别、联系及优缺点

    浅谈JAVA GUI中,AWT与Swing的区别.联系及优缺点 A.区别 1.发布的时间 AWT是在JDK 1.0版本时提出的 Swing是在AWT之后提出的(JAVA 2) 2. ”重量” AWT是 ...

  7. 浅谈 Swift 2 中的 Objective-C 指针

    浅谈 Swift 2 中的 Objective-C 指针 2015-09-07  499 文章目录 1. 在 Swift 中读 C 指针 2. 在 Swift 中创建 C 指针 3. 总结 作者:Ja ...

  8. 浅谈人脸识别中的loss 损失函数

    浅谈人脸识别中的loss 损失函数 2019-04-17 17:57:33 liguiyuan112 阅读数 641更多 分类专栏: AI 人脸识别   版权声明:本文为博主原创文章,遵循CC 4.0 ...

  9. 浅谈C++11中的多线程(三)

    摘要 本篇文章围绕以下几个问题展开: 进程和线程的区别 何为并发?C++中如何解决并发问题?C++中多线程的基本操作 浅谈C++11中的多线程(一) - 唯有自己强大 - 博客园 (cnblogs.c ...

  10. 浅谈C++11中的多线程(二)

    摘要 本篇文章围绕以下几个问题展开: 进程和线程的区别 何为并发?C++中如何解决并发问题?C++中多线程的基本操作 浅谈C++11中的多线程(一) - 唯有自己强大 - 博客园 (cnblogs.c ...

随机推荐

  1. Win7下完全卸载Oracle 11g的步骤

    1 右击“计算机”-->管理-->服务和应用程序-->服务,停掉所有Oracle相关的服务(以Oracle打头的,比如OracleDBConsoleorcl). 2 开始--> ...

  2. [学习笔记]tarjan求割边

    上午打模拟赛的时候想出了第三题题解,可是我不会求割边只能暴力判割边了QAQ 所以,本文介绍求割边(又称桥). 的定义同求有向图强连通分量. 枚举当前点的所有邻接点: 1.如果某个邻接点未被访问过,则访 ...

  3. Slave2: no datanode to stop(权限)

    有些datanode没有启动,要么是id不一致,我删除了还是不行,要么是权限问题,我邮件属性查看权限,发现不是hxsyl组,我删除,重建.

  4. 【poj1419】 Graph Coloring

    http://poj.org/problem?id=1419 (题目链接) 题意 求一般图最大独立集. Solution 最大独立集=补图的最大团. 代码 // poj1419 #include< ...

  5. eclipse各版本代号

    从2006年起,Eclipse基金会每年都会安排同步发布(simultaneous release).同步发布主要在6月进行,并且会在接下来的9月及2月释放出SR1及SR2版本.如下图所示的版本历史: ...

  6. Android程序设计-RecyclerView的使用

    [定义] 看到这个标题,也许你会问什么是RecyclerView?其实开始的时候我也不知道- -,下面小编将带领大家领略RecyclerView的强大之处 [描述] 看完这个我想大家应该知道了吧,这个 ...

  7. poj3696 快速幂的优化+欧拉函数+gcd的优化+互质

    这题满满的黑科技orz 题意:给出L,要求求出最小的全部由8组成的数(eg: 8,88,888,8888,88888,.......),且这个数是L的倍数 sol:全部由8组成的数可以这样表示:((1 ...

  8. UVa 7146 Defeat the Enemy(贪心)

    题目链接: 传送门 Defeat the Enemy Time Limit: 3000MS     Memory Limit: 32768 KB Description Long long ago t ...

  9. Enlisting multiple 1-phase aware participants in the same transaction

    In some cases it may be necessary to enlist participants that aren't two-phase commit aware into a t ...

  10. BZOJ1972: [Sdoi2010]猪国杀

    “此题注意样例少了个J,且牌堆可能用完牌,若牌用完则不停取最后一张”.——hzwer 然后直接模拟,认真读题,理清思路. #include<cstdio> #include<list ...