引言

  上一篇博客我们介绍了交叉联接,内联接,外联接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. js 删除

    /* *  方法:Array.remove(dx) *  功能:根据元素值删除数组元素. *  参数:元素值 *  返回:在原数组上修改数组 *  作者:pxp */ Array.prototype. ...

  2. linux 下更改 blast+ version

    to 2.2.30 cd /usr/bin sudo su mv blastdb_aliastool blastdb_aliastool_2.25 mv blastdbcheck blastdbche ...

  3. Java线程与并发库高级应用-线程范围内共享数据ThreadLocal类

    1.线程范围内共享变量 1.1 前奏: 使用一个Map来实现线程范围内共享变量 public class ThreadScopeShareData { static Map<Thread, In ...

  4. 【GCJ2008E】日程表 最小割

    Google Code Jam 2008 E 日程表 [题目描述] 热情的选手Sphinny正在看新一年的日程表,并发现已经安排了很多编 程竞赛.她将这一年的每一天都用以下三种方式之一在日程表上打标记 ...

  5. BZOJ3142 [Hnoi2013]数列

    Description 小 T最近在学着买股票,他得到内部消息:F公司的股票将会疯涨.股票每天的价格已知是正整数,并且由于客观上的原因,最多只能为N.在疯涨的K天中小T观察 到:除第一天外每天的股价都 ...

  6. AutoIt3(AU3)开发的智能驱动安装工具,用于系统封装,支持参数静默启动

    项目相关地址 源码:https://github.com/easonjim/Smart_Driver bug提交:https://github.com/easonjim/Smart_Driver

  7. restore和recover的区别(转)

    recover和restore的区别: restore just copy the physical file, recover will consistent the database. resto ...

  8. xudyh的gcd模板

    hdu 5019 #include <cstdlib> #include <cctype> #include <cstring> #include <cstd ...

  9. Linux Nginx(master-slave)、Apache(woker、prefork) Working Mode Research

    catalog . Apache工作模式 . Nginx工作模式 1. Apache工作模式 Apache服务器支持三种工作模式(Apache称之为MPM,简写为Multi-Processing Mo ...

  10. setjmp()、longjmp() Linux Exception Handling/Error Handling、no-local goto

    目录 . 应用场景 . Use Case Code Analysis . 和setjmp.longjmp有关的glibc and eglibc 2.5, 2.7, 2.13 - Buffer Over ...