引言

  上一篇博客我们介绍了交叉联接,内联接,外联接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. UIScrollView 实践经验(转)

    转载自:http://tech.glowing.com/cn/practice-in-uiscrollview/ UIScrollView(包括它的子类 UITableView 和 UICollect ...

  2. How to fix the sources list

    How to fix the sources list Sometimes the apt-get may not work, it is often caused by the misspelled ...

  3. Spark 与 MapReduce的区别

    学习参考自 http://spark-internals.books.yourtion.com/markdown/4-shuffleDetails.html 1.  Shuffle read 边 fe ...

  4. target file里面的每个string字段的双引号怎么去掉

    今天在做一个extract,把数据库里面的表经过一些过程,最终输入到flat file中. 但是最终的结果中,每个target file的string字段,含有双引号如下: NAME_ID    NA ...

  5. bzoj2683简单题

    #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> ...

  6. Jenkins通过FTP上传站点太多文件导致太慢且不稳定,切换为压包上传再解压的思路(asp.net)

    在本地先处理好要上传的站点文件之后,可能会因为一些网页切图导致ftp上传不稳定,中断,或者文件占用的问题. 那么换了一种实现思路,要借助jenkins的工具jenkins-cli.jar. 解决思路: ...

  7. POJ 2785 4 Values whose Sum is 0(想法题)

    传送门 4 Values whose Sum is 0 Time Limit: 15000MS   Memory Limit: 228000K Total Submissions: 20334   A ...

  8. CDN网络(二)之配置和优化CDN核心缓存软件--squid

    前言 squid是众多CDN厂商使用的核心缓存软件,都在已有的基础上进行二次开发.在部署squid的时候,建议遵循下面的规范. 1. 使用大内存服务器 对于热点文件,我们让squid用内存缓存,这样大 ...

  9. BZOJ4590: [Shoi2015]自动刷题机

    显然看着就是二分,仔细看的话显然刷的题数随n增大单调不升. 挂了一发是因为无解输出一个-1而不是两个…… #include<cstdio> #include<algorithm> ...

  10. linux程序处理po多语言的两种脚本配置方式

    1.在configure.ac里面配置ALL_LINGUAS,然后调用AM_GLIB_GNU_GETTEXT 2.在po目录下面放置LINGUAS文件,由gettextize来生成并处理