引言

  上一篇博客我们介绍了交叉联接,内联接,外联接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. 【POJ 3177】Redundant Paths(边双连通分量)

    求出每个边双连通分量缩点后的度,度为1的点即叶子节点.原图加上(leaf+1)/2条边即可变成双连通图. #include <cstdio> #include <cstring> ...

  2. c# 导入导出Excel

    1.引用两个js Codaxy.Xlio.dllCodaxy.Xlio.XmlSerializers.dll 2.导出 public string EntityListToExcel(string p ...

  3. C++之再续前缘(一)——C++基础(与C语言的差异)(下)

    1.void型指针 void本身是一种数据类型,通常表示无值,不能声明void类型的变量,但是可以声明void类型的指针, void*类型的指针表示不确定的类型,是一种通用型的指针,也就是说任何类型的 ...

  4. js-一种去掉数组中重复元素的方法

    思路来源于某个同学的博客 function norepeat(arr){ return arr.filter(function(val,index,array) { return array.inde ...

  5. 【BZOJ-2440】完全平方数 容斥原理 + 线性筛莫比乌斯反演函数 + 二分判定

    2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2371  Solved: 1143[Submit][Sta ...

  6. asp.net接收ajax请求参数时为空的现象

    如题,如果使用ajax请求asp.net后台时,如果使用jquery时,默认是添加了请求头,使后台能识别,并能通过Request对象进行获取. 但是如果你使用的是window.XMLHttpReque ...

  7. spring容器初始化执行某个方法

    在做web项目开发中,尤其是企业级应用开发的时候,往往会在工程启动的时候做许多的前置检查. 比如检查是否使用了我们组禁止使用的Mysql的group_concat函数,如果使用了项目就不能启动,并指出 ...

  8. 如何自己编写一个easyui插件

    本文介绍如何通过参考1.4.2版本的progressbar的源码自己编写一个HelloWorld级别的easyui插件,以及如何拓展插件的功能. 有利于我们理解easyui插件的实现,以及了解如何对e ...

  9. django中migration文件是干啥的

    昨天很蠢的问leader git push的时候会不会把本地的数据库文件上传上去,意思是django中那些migration文件修改之后会不会上传. 然后得知不会,因为所有的数据库都存在本机的mysq ...

  10. 一键搭建vpn服务器

    今天花了很多时间搭建vpn服务器,后来找到一篇一键搭建服务器的文章,那叫一个爽,附上链接收藏~~~看开以后要写脚本了 http://www.centoscn.com/image-text/instal ...