浅谈T-SQL中的特殊联结
引言
上一篇博客我们介绍了交叉联接,内联接,外联接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中的特殊联结的更多相关文章
- 转: 浅谈C/C++中的指针和数组(二)
转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组 ...
- 转:浅谈C/C++中的指针和数组(一)
再次读的时候实践了一下代码,结果和原文不一致 error C2372: 'p' : redefinition; different types of indirection 不同类型的间接寻址 /// ...
- 转载 浅谈C/C++中的static和extern关键字
浅谈C/C++中的static和extern关键字 2011-04-21 16:57 海子 博客园 字号:T | T static是C++中常用的修饰符,它被用来控制变量的存贮方式和可见性.ext ...
- 浅谈C语言中的强符号、弱符号、强引用和弱引用
摘自http://www.jb51.net/article/56924.htm 浅谈C语言中的强符号.弱符号.强引用和弱引用 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2014- ...
- 浅谈关于QT中Webkit内核浏览器
关于QT中Webkit内核浏览器是本文要介绍的内容,主要是来学习QT中webkit中浏览器的使用.提起WebKit,大家自然而然地想到浏览器.作为浏览器内部的主要构件,WebKit的主要工作是渲染.给 ...
- 浅谈JAVA GUI中,AWT与Swing的区别、联系及优缺点
浅谈JAVA GUI中,AWT与Swing的区别.联系及优缺点 A.区别 1.发布的时间 AWT是在JDK 1.0版本时提出的 Swing是在AWT之后提出的(JAVA 2) 2. ”重量” AWT是 ...
- 浅谈 Swift 2 中的 Objective-C 指针
浅谈 Swift 2 中的 Objective-C 指针 2015-09-07 499 文章目录 1. 在 Swift 中读 C 指针 2. 在 Swift 中创建 C 指针 3. 总结 作者:Ja ...
- 浅谈人脸识别中的loss 损失函数
浅谈人脸识别中的loss 损失函数 2019-04-17 17:57:33 liguiyuan112 阅读数 641更多 分类专栏: AI 人脸识别 版权声明:本文为博主原创文章,遵循CC 4.0 ...
- 浅谈C++11中的多线程(三)
摘要 本篇文章围绕以下几个问题展开: 进程和线程的区别 何为并发?C++中如何解决并发问题?C++中多线程的基本操作 浅谈C++11中的多线程(一) - 唯有自己强大 - 博客园 (cnblogs.c ...
- 浅谈C++11中的多线程(二)
摘要 本篇文章围绕以下几个问题展开: 进程和线程的区别 何为并发?C++中如何解决并发问题?C++中多线程的基本操作 浅谈C++11中的多线程(一) - 唯有自己强大 - 博客园 (cnblogs.c ...
随机推荐
- js 删除
/* * 方法:Array.remove(dx) * 功能:根据元素值删除数组元素. * 参数:元素值 * 返回:在原数组上修改数组 * 作者:pxp */ Array.prototype. ...
- linux 下更改 blast+ version
to 2.2.30 cd /usr/bin sudo su mv blastdb_aliastool blastdb_aliastool_2.25 mv blastdbcheck blastdbche ...
- Java线程与并发库高级应用-线程范围内共享数据ThreadLocal类
1.线程范围内共享变量 1.1 前奏: 使用一个Map来实现线程范围内共享变量 public class ThreadScopeShareData { static Map<Thread, In ...
- 【GCJ2008E】日程表 最小割
Google Code Jam 2008 E 日程表 [题目描述] 热情的选手Sphinny正在看新一年的日程表,并发现已经安排了很多编 程竞赛.她将这一年的每一天都用以下三种方式之一在日程表上打标记 ...
- BZOJ3142 [Hnoi2013]数列
Description 小 T最近在学着买股票,他得到内部消息:F公司的股票将会疯涨.股票每天的价格已知是正整数,并且由于客观上的原因,最多只能为N.在疯涨的K天中小T观察 到:除第一天外每天的股价都 ...
- AutoIt3(AU3)开发的智能驱动安装工具,用于系统封装,支持参数静默启动
项目相关地址 源码:https://github.com/easonjim/Smart_Driver bug提交:https://github.com/easonjim/Smart_Driver
- restore和recover的区别(转)
recover和restore的区别: restore just copy the physical file, recover will consistent the database. resto ...
- xudyh的gcd模板
hdu 5019 #include <cstdlib> #include <cctype> #include <cstring> #include <cstd ...
- Linux Nginx(master-slave)、Apache(woker、prefork) Working Mode Research
catalog . Apache工作模式 . Nginx工作模式 1. Apache工作模式 Apache服务器支持三种工作模式(Apache称之为MPM,简写为Multi-Processing Mo ...
- 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 ...