SQL Server的JOIN是支持使用小括号修改执行顺序的
假如现在我们的SQL Server数据库中有三个表:[T_A]、[T_B]和[T_C],它们的建表语句如下:
--建表语句[T_A]
CREATE TABLE [dbo].[T_A](
[ID_A] [INT] NOT NULL,
CONSTRAINT [PK_T_A] PRIMARY KEY CLUSTERED
(
[ID_A] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]; --建表语句[T_B]
CREATE TABLE [dbo].[T_B](
[ID_B] [INT] NOT NULL,
CONSTRAINT [PK_T_B] PRIMARY KEY CLUSTERED
(
[ID_B] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]; --建表语句[T_C]
CREATE TABLE [dbo].[T_C](
[ID_C] [INT] NOT NULL,
CONSTRAINT [PK_T_C] PRIMARY KEY CLUSTERED
(
[ID_C] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY];
[T_A]、[T_B]和[T_C]每个表都只有一个INT类型的列,我们使用下面的语句给这三个表插入数据:
INSERT INTO [dbo].[T_A]
VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); INSERT INTO [dbo].[T_B]
VALUES (1),(2),(3),(4),(5); INSERT INTO [dbo].[T_C]
VALUES (1),(2),(3);
我们都知道默认情况下,SQL Server中的JOIN语句都是按表出现的顺序执行的,例如下面的SELECT语句中,SQL Server会先执行表[T_A]和[T_B]之间的LEFT JOIN,然后再执行表[T_B]和[T_C]之间的INNER JOIN:
SELECT *
FROM
[dbo].[T_A]
LEFT JOIN
[dbo].[T_B]
ON
[T_A].ID_A=[T_B].ID_B
INNER JOIN
[dbo].[T_C]
ON
[T_B].ID_B=[T_C].ID_C
执行结果:

由于上面的SELECT语句中,最后INNER JOIN了表[T_C],所以最后查询结果肯定和表[T_C]的数据行数一致,只有三行。
那么在上面的SELECT语句中,我们能不能在不调整表顺序的情况下,让SQL Server先执行表[T_B]和[T_C]之间的INNER JOIN,再执行表[T_A]和[T_B]之间的LEFT JOIN呢,因为这样的话,由于最后执行的是表[T_A]的LEFT JOIN,所以我们就可以在查询结果中保留表[T_A]的所有数据。
答案是可以的,我们要给表[T_B]和[T_C]之间的INNER JOIN加上小括号:
SELECT *
FROM
[dbo].[T_A]
LEFT JOIN
(
[dbo].[T_B]
INNER JOIN
[dbo].[T_C]
ON
[T_B].ID_B=[T_C].ID_C
)
ON
[T_A].ID_A=[T_B].ID_B
执行结果:

由于现在我们给表[T_B]和[T_C]之间的INNER JOIN加上了小括号,所以SQL Server会先执行小括号内的INNER JOIN,再执行小括号外的LEFT JOIN,这样我们就在查询结果中保留了表[T_A]的所有数据。
因此我们可以看到,SQL Server的JOIN是支持通过小括号来改变表与表之间的执行顺序的,通过小括号我们可以让JOIN按照我们想要的顺序来执行。
SQL Server的JOIN是支持使用小括号修改执行顺序的的更多相关文章
- SQL Server 2008 R2不支持limit(限制行数)
SQL Server 2008 R2不支持limit 可用:select top 3 * from Websites2 MySQL 语法 SELECT *FROM PersonsLIMIT 5; Or ...
- SQL点滴12—SQL Server备份还原数据库中的小把戏
原文:SQL点滴12-SQL Server备份还原数据库中的小把戏 备份数据库时出现一个不太了解的错误 ,错误信息“is formatted to support 1 media families, ...
- Sql server left join,right join和inner join的比较
转载于:http://www.2cto.com/database/201206/137067.html Sql server left join,right join和inner join的比较 ...
- [转帖]微软 SQL Server 2008/R2 停止支持
微软 SQL Server 2008/R2 停止支持 微软停止支持 SQLSERVER 2008R2 https://t.cj.sina.com.cn/articles/view/3172142827 ...
- 三、SQL Server 对JSON的支持
一.SQL Server 对JSON的支持 一.实现效果 现在 我用数据库是sql2008 ,共计2万数据. 每一条数据里面的有一个为attribute字段是 json存储状态属性, 我怎么查看 ...
- SQL Server索引进阶:第九级,读懂执行计划
原文地址: Stairway to SQL Server Indexes: Level 9,Reading Query Plans 本文是SQL Server索引进阶系列(Stairway to SQ ...
- 04Microsoft SQL Server 数据库创建,查看,使用,修改及删除
Microsoft SQL Server 数据库创建,查看,使用,修改及删除 创建数据库 创建普通数据库 USE [master] GO CREATE DATABASE [MyDataBase] -- ...
- SQL SERVER 2014 各个版本支持的功能
转自:https://technet.microsoft.com/library/cc645993 转换箱规模限制 功能名称 Enterprise Business Intelligence Stan ...
- SQL Server 2016 JSON原生支持实例说明
背景 Microsoft SQL Server 对于数据平台的开发者来说越来越友好.比如已经原生支持XML很多年了,在这个趋势下,如今也能在SQLServer2016中使用内置的JSON.尤其对于一些 ...
随机推荐
- 使用yum安装不知道到底安装在什么文件夹
find /* >yum001 #记录之前的文件夹 find /* >yum002 #记录安装完成后的文件夹 diff yum001 yum002 >yum000 ...
- [十六]JavaIO之InputStreamReader 与 OutputStreamWriter
简介 InputStreamReader OutputStreamWriter是转换流 InputStreamReader 是字节流通向字符流的桥梁,它将字节流转换为字符流. OutputStre ...
- 【转】C#中判断网址是否有效
本文内容来源网络,如涉及版权,请联系作者删除. 思路:C#语言判断网址是否正确,思路是向网址发起连接,根据状态判断网址是否有效. 代码如下: //仅检测链接头,不会获取链接的结果.所以速度很快,超时的 ...
- 将excel按照某一列拆分成多个文件(方案整理)
1解决方案:将excel按照某一列拆分成多个文件 https://blog.csdn.net/ntotl/article/details/79141314 2遇到的问题:解决vbe6ext.olb不能 ...
- Qt Creator的下载和安装
原文:https://blog.csdn.net/weixin_38090427/article/details/83827678 一,Qt和Qt Creator的区别 Qt是C++的一个库,或者说是 ...
- js 常用
js设置 div高度和宽度 function autoHeight() { var h = $(window).height(); var w = $(window).width(); $(" ...
- Puppeteer之大屏批量截图
事情的起因是客户三天两头的要求让我们给大屏截图,一定要最新的数据.所以我就自告奋勇研究了一下. puppeteer是一款headless浏览器,由谷歌官方维护.先看看puppeteer ...
- 使用OCLint和Sonar对iOS代码分析和质量管理
OCLint 是一个强大的静态代码分析工具,可以用来提高代码质量,查找潜在的bug,主要针对c,c++和Objective-c的静态分析. Sonar 是一个用于代码质量管理的开放平台.通过插件机制, ...
- 如何获取Debug Android Hash Key
在接入FaceBook第三方登录的时候,需要获取Android Hash Key. Android Hash Key即密钥散列有两种,一种是开发秘钥散列,一种是发布秘钥散列.这里主要介绍如何获取开发秘 ...
- Servlet工作原理解析 《深入分析java web 技术内幕》第九章
参考关于servblet的相关文章 侧重概况:https://blog.csdn.net/levycc/article/details/50728921 ibm的相关:https://www.ibm. ...