做了一个如下的小厕所,如果我需要得到返回是 d,f 那我需要用那组语句呢?

A:

;WITH CA AS(
SELECT *
FROM (VALUES('a'),('b'),('c'),('d'))a (A))
,CB AS (
SELECT *
FROM (VALUES('a'),('b'),('c'),('f'))a (A)
)
SELECT * FROM CA
EXCEPT SELECT * FROM CB
UNION
SELECT * FROM CB
EXCEPT SELECT * FROM CA

B:

;WITH CA AS(
SELECT *
FROM (VALUES('a'),('b'),('c'),('d'))a (A))
,CB AS (
SELECT *
FROM (VALUES('a'),('b'),('c'),('f'))a (A)
)
SELECT * FROM CA
EXCEPT SELECT * FROM CB
UNION
(SELECT * FROM CB
EXCEPT SELECT * FROM CA)

C:

;WITH CA AS(
SELECT *
FROM (VALUES('a'),('b'),('c'),('d'))a (A))
,CB AS (
SELECT *
FROM (VALUES('a'),('b'),('c'),('f'))a (A)
)
(SELECT * FROM CA
EXCEPT SELECT * FROM CB)
UNION
(SELECT * FROM CB
EXCEPT SELECT * FROM CA)

实际情况执行一下就知道,其实BC 的语句都可以执行。而A的执行情况就是只返回了 d。这个其实是跟select 的执行顺序有关的。

通常我们看select 的执行顺序的时候,可能会忽略这2个不常用的连接谓词导致误判。这里做一个实验就可以发现,其实 Except(Intersect 同理) 的查询优先级是和 union 或者union all 是同级的。

所以遵循从左到右的顺序,如果不用括号改变执行顺序,从上面的例子,将会返回  CA Except CB -> Union CB -> Except CA 的执行结果。也就是一个容易忽略的位置。

因为比较少用,所以我也躺枪了。在此分享一波,希望大家不要踩坑。

PS

1 select 执行顺序的地址 :https://docs.microsoft.com/zh-cn/sql/t-sql/queries/select-transact-sql

2 Except 和 Intersect 都是返回交叉之后不重复的结果的,这个需要特别注意

使用 Except 和 Intersect的更多相关文章

  1. LINQ to SQL语句(8)之Concat/Union/Intersect/Except

    适用场景:对两个集合的处理,例如追加.合并.取相同项.相交项等等. Concat(连接) 说明:连接不同的集合,不会自动过滤相同项:延迟. 1.简单形式: var q = ( from c in db ...

  2. 【oracle】union、union all、intersect、minus 的用法及区别

    一.union与union all 首先建两个view create or replace view test_view_1 as as c from dual union as c from dua ...

  3. oracle之集合操作函数---minus、union、intersect

    集合操作符专门用于合并多条select语句的结果,包括:UNION,UNION ALL,INTERSECT,MINUS.当使用集合操作函数时,需保证数据集的字段数据类型和数目一致. 使用集合操作符需要 ...

  4. LINQ的Intersect方法

    找到两个集合中交集部分: source code: IEnumerable<int> a = new List<int>{ { }, { }, { } }; IEnumerab ...

  5. Linq连接查询之左连接、右连接、内连接、全连接、交叉连接、Union合并、Concat连接、Intersect相交、Except与非查询

    内连接查询 内连接与SqL中inner join一样,即找出两个序列的交集 Model1Container model = new Model1Container(); //内连接 var query ...

  6. List之Union(),Intersect(),Except()

    http://www.cnblogs.com/qinpengming/archive/2012/12/03/2800202.html List之Union(),Intersect(),Except() ...

  7. Sql中的并(UNION)、交(INTERSECT)、差(minus)、除去(EXCEPT)详解

    UNION 查询选修了180101号或180102号课程或二者都选修了的学生学号.课程号和成绩. (SELECT  学号, 课程号, 成绩 FROM   学习 WHERE   课程号='180101' ...

  8. INTERSECT交集运算

    INTERSECT交集是由既属于集合A,又属于集合B的所有元素组成的集合,如示意图1.

  9. SQL Server里的INTERSECT ALL

    在上一篇文章里,我讨论了INTERSECT设置操作的基础,它和INNER JOIN的区别,还有为什么需要好的索引设计支持.今天我想谈下SQL Server里并未实现的INTERSECT ALL操作. ...

  10. SQL Server里的INTERSECT

    在今天的文章里,我想讨论下SQL Server里的INTERSECT设置操作.INTERSECT设置操作彼此交叉2个记录集,返回2个集里列值一样的记录.下图演示了这个概念. INTERSECT与INN ...

随机推荐

  1. winhex中判断+MBR+DBR+EBR方法

    [/hide] 扇区开始描述). 用 winhex 做U盘免疫AUTO.INF 用WinHex制作无法修改的AutoRun.inf文件 在我们日常工作中,经常需要使用闪存(也称为U盘或者优盘)主要是A ...

  2. 芝麻HTTP:Scrapyd的安装

    Scrapyd是一个用于部署和运行Scrapy项目的工具,有了它,你可以将写好的Scrapy项目上传到云主机并通过API来控制它的运行. 既然是Scrapy项目部署,基本上都使用Linux主机,所以本 ...

  3. Java并发编程笔记4-线程池

    我们使用线程的时候就去创建一个线程,但是就会有一个问题: 如果并发的线程数量非常多,而且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会导致大大降低系统的效率,因为频繁创建线程和销毁线 ...

  4. xml的SAX解析规则

    一,为什么要用它 1.1,讲解 DOM解析原理:一次性把xml文档加载进内存,然后在内存中构建Document树. 对内存要求比较要. 缺点: 不适合读取大容量的xml文件,容易导致内存溢出. SAX ...

  5. WPF基础篇之静态资源和动态资源

    静态资源(StaticResource)指的是在程序载入内存时对资源的一次性使用,之后就不再访问这个资源了. 动态资源(DynamicResource)指的是在程序运行过程中然会去访问资源. 一.定义 ...

  6. 如何使用jQuery-ContextMenu实现右击菜单

    最近在做项目中,遇到一个棘手的问题,页面上有很多功能需要实现,每个功能需要绑定一个按钮.如果一个功能绑定一个按钮,那么将会占用页面很大的空间,而且可能会使页面变得不美观.思前想后,决定将所有按钮做成右 ...

  7. jdbc连接数据库并打印的简单例子

    6步连接数据库: import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; impor ...

  8. 论文笔记(8):BING: Binarized Normed Gradients for Objectness Estimation at 300fps

    译文: <基于二值化赋范梯度特征的一般对象估计> 摘要: 通过训练通用的对象估计方法来产生一组候选对象窗口,能够加速传统的滑动窗口对象检测方法.我们观察到一般对象都会有定义完好的封闭轮廓, ...

  9. UML 中extend和include的区别

    在UML用例图中有两种关系——包含和扩展,容易混淆,下面通过一张表来区别一下这两种关系.

  10. mac 上传本地代码到 Github 教程

    网上有很多关于windows系统上传本地代码到github的文章,但是自己用的是mac,在网上也找了相关文章,实践的过程中还是遇到了很多问题,现在把自己的成功实践分享出来,希望能对大家有帮助. 1.首 ...