假如现在我们的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是支持使用小括号修改执行顺序的的更多相关文章

  1. SQL Server 2008 R2不支持limit(限制行数)

    SQL Server 2008 R2不支持limit 可用:select top 3 * from Websites2 MySQL 语法 SELECT *FROM PersonsLIMIT 5; Or ...

  2. SQL点滴12—SQL Server备份还原数据库中的小把戏

    原文:SQL点滴12-SQL Server备份还原数据库中的小把戏 备份数据库时出现一个不太了解的错误 ,错误信息“is formatted to support  1 media families, ...

  3. Sql server left join,right join和inner join的比较

    转载于:http://www.2cto.com/database/201206/137067.html   Sql server left join,right join和inner join的比较 ...

  4. [转帖]微软 SQL Server 2008/R2 停止支持

    微软 SQL Server 2008/R2 停止支持 微软停止支持 SQLSERVER 2008R2 https://t.cj.sina.com.cn/articles/view/3172142827 ...

  5. 三、SQL Server 对JSON的支持

    一.SQL Server 对JSON的支持 一.实现效果   现在 我用数据库是sql2008 ,共计2万数据. 每一条数据里面的有一个为attribute字段是 json存储状态属性,  我怎么查看 ...

  6. SQL Server索引进阶:第九级,读懂执行计划

    原文地址: Stairway to SQL Server Indexes: Level 9,Reading Query Plans 本文是SQL Server索引进阶系列(Stairway to SQ ...

  7. 04Microsoft SQL Server 数据库创建,查看,使用,修改及删除

    Microsoft SQL Server 数据库创建,查看,使用,修改及删除 创建数据库 创建普通数据库 USE [master] GO CREATE DATABASE [MyDataBase] -- ...

  8. SQL SERVER 2014 各个版本支持的功能

    转自:https://technet.microsoft.com/library/cc645993 转换箱规模限制 功能名称 Enterprise Business Intelligence Stan ...

  9. SQL Server 2016 JSON原生支持实例说明

    背景 Microsoft SQL Server 对于数据平台的开发者来说越来越友好.比如已经原生支持XML很多年了,在这个趋势下,如今也能在SQLServer2016中使用内置的JSON.尤其对于一些 ...

随机推荐

  1. Linux平台运行jmeter

    这篇博客介绍 jmeter 在 Linux 环境进行压测,大致流程是 在 window上编辑好测试脚本,然后拷贝到 Linux上运行,再把 Linux上的运行结果拿到 windows 的 jmeter ...

  2. python基础6--面向对象基础、装饰器

    1.类 class Student: def __init__(self, name, grade): self.name = name self.grade = grade def introduc ...

  3. Perl进程:僵尸进程和孤儿进程

    概念 僵尸进程:当子进程退出时,父进程还没有(使用wait或waitpid)接收其退出状态时,子进程就成了僵尸进程 孤儿进程:当子进程还在运行时,父进程先退出了,子进程就会成为孤儿进程被pid=1的i ...

  4. PHP指定日期转时间戳

    使用date_parse_from_format 可以转换指定的格式:举个例子: <?php $str = '2018.10.01';//或者 2018年10月1日 $arr = date_pa ...

  5. 学JAVA第六天,运算符、表达式、if语句以及for、while、都循环

    今天老师讲的内容有点多,但是都是在学C#时学过的,用法都差不多,所以很好理解. 算术运算符:+, - ,* , / ,% ,++  ,-- 关系运算符:>,<,>=,<=,== ...

  6. Android开发——Drawable与Bitmap知识

    从资源中获得drawable Drawable drawable = getResources().getDrawable(R.drawable.xxx); drawable转换bitmapdrawb ...

  7. 关于HTTP中GET与POST的区别

    GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 看似很简单,其实是一道送命题 “标准答案”: GET在浏览器回退时是无害的,而POST会再次提交请求. ...

  8. 如何高效地遍历 MongoDB 超大集合?

    GitHub 仓库:Fundebug/loop-mongodb-big-collection 本文使用的编程语言是 Node.js,连接 MongoDB 的模块用的是mongoose.但是,本文介绍的 ...

  9. 教你快速撸一个免费HTTPS证书

    摘要: 免费 HTTPS 证书,了解一下? HTTPS 已成为业界标准,这篇博客将教你申请Let's Encrypt的免费 HTTPS 证书. 本文的操作是在 Ubuntu 16.04 下进行,使用 ...

  10. Spring(二)继承jdbcDaoSupport的方式实现(增删改查)

    一 首先创建数据库表和相应的字段,并创建约束 二 建立项目,导入jar包(ioc,aop,dao,数据库驱动,连接池)并且将applicationContext.xml文件放在src下 三 开启组件扫 ...