当前位置: 首页 > news >正文

使用 Except 和 Intersect

做了一个如下的小厕所,如果我需要得到返回是 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 都是返回交叉之后不重复的结果的,这个需要特别注意

 

转载于:https://www.cnblogs.com/Gin-23333/p/8674562.html

相关文章:

  • ES6 使用forEach遍历数组
  • 初学MySQL基础知识笔记--02
  • Shell报错bash^M /bin/bash^M: bad interpreter: No such file or directory
  • TFRecords文件的生成和读取(1)
  • lis最长递增子序列
  • Python全栈之路系列之深浅拷贝
  • mysql之count,max,min,sum,avg,celing,floor
  • 课堂小练习
  • 【题解】 [POI2012]FES-Festival (差分约束)
  • mac环境下配置nginx
  • 迭代器(Iterator)
  • git设置HTTP代理
  • Box and Ball
  • jsp中的el表达式没有解析
  • android解决AVD中文路径无法启动问题
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • 3.7、@ResponseBody 和 @RestController
  • AHK 中 = 和 == 等比较运算符的用法
  • CSS居中完全指南——构建CSS居中决策树
  • Git初体验
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Java到底能干嘛?
  • zookeeper系列(七)实战分布式命名服务
  • 代理模式
  • 第2章 网络文档
  • 两列自适应布局方案整理
  • 区块链共识机制优缺点对比都是什么
  • 新手搭建网站的主要流程
  • 学习笔记TF060:图像语音结合,看图说话
  • 移动端唤起键盘时取消position:fixed定位
  • Mac 上flink的安装与启动
  • 如何在招聘中考核.NET架构师
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • # C++之functional库用法整理
  • #{}和${}的区别?
  • #etcd#安装时出错
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (6)STL算法之转换
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (javascript)再说document.body.scrollTop的使用问题
  • (分布式缓存)Redis持久化
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (已解决)什么是vue导航守卫
  • (转)创业的注意事项
  • (转)用.Net的File控件上传文件的解决方案
  • *** 2003
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .NET CF命令行调试器MDbg入门(一)
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能