我真是OLD到死,虽然记得以前肯定看到过INTERSECT/EXCEPT这两个关键字,前不久还在羡慕Oracle有+/-集合操作符而SQL Server怎么竟然没有。。。现在想想难怪当初微软面试的时候面试官告诉我最好了解一下SQL Server 2005新的函数。。。

下面翻译一下http://www.sqlstuff.dk/post/intersect-except-versus-in-not-in.aspx,对INTERSECT/EXCEPT与IN/NOT IN进行比较。

SQL Server有两个有用的,用于找到两个表之间共有与差异行的函数:EXCEPT与INTERSECT。EXCEPT返回属于第一个表而不属于第二个表的行,而INTERSECT返回第一个和第二个表的交集。但它们的性能如何?

实际生活中我发现我很少有机会比较两个拥有完全相同数据列的表,但偶尔也会有这种需求。(难道这两个函数基本只在面试和考试中派用场。。。?)但是大多数情况下,这些行都有主键或其他索引,所以我一般自己只用IN和NOT IN。

为了测试,我建立了两个测试表:

DECLARE @I INT 
SET @I = 0

WHILE @I < 10000 BEGIN 
 IF @I % 5 <> 0 
  INSERT INTO Table1 VALUES (@I, REPLICATE('A', 10)) 
 IF @I % 4 <> 0 INSERT 
  INTO Table2 VALUES (@I, REPLICATE('A', 10)) 
 SET @I = @I + 1 
END

我没有建立索引。
接下来我要查询属于表1不属于表2的行。由于我知道ID是一个唯一键(unique key),就只适用NOT IN。

SELECT * 
FROM Table1 
WHERE ID NOT IN ( 
 SELECT ID FROM Table2 

GO

SELECT * FROM Table1 
EXCEPT 
SELECT * FROM Table2 
GO

这样是人都知道肯定NOT IN效率差的。比率差不多是23% vs. 77%,3.3倍左右。

如果我不仅需要确认ID,还需要确认VALUE,查询语句如下:

SELECT * 
FROM Table1 
WHERE ID NOT IN ( 
 SELECT ID FROM Table2 

OR [Value] NOT IN ( 
 SELECT [Value] FROM Table2 

GO

SELECT * FROM Table1 
EXCEPT 
SELECT * FROM Table2 
GO

差异进一步拉大。22% vs. 78%。

INTERSECT的结果也大同小异。

转载于:https://www.cnblogs.com/galaxyyao/archive/2009/11/17/1604679.html

INTERSECT/EXCEPT VS. IN/NOT IN相关推荐

  1. R函数:交集intersect、并集union、找不同setdiff、判断相同setequal

    R语言基础系列: 你知道R中的赋值符号箭头(<-)和等号(=)的区别吗? 1数据类型(向量.数组.矩阵. 列表和数据框) 2读写数据所需的主要函数.与外部环境交互 3数据筛选--提取对象的子集 ...

  2. 渗透脚本快速生成工具Intersect

    渗透脚本快速生成工具Intersect 当渗透人员获取目标系统的执行权限,往往需要编写相应的脚本,实现更多的渗透操作.Kali Linux提供一款Python脚本快速生成工具Intersect.该工具 ...

  3. Oracle集合操作函数:Union、Union All、Intersect、Minus

    Union.对两个结果集进行并集操作.不包含反复行,同一时候进行默认规则的排序: Union All.对两个结果集进行并集操作,包含反复行.不进行排序: Intersect,对两个结果集进行交集操作. ...

  4. Oracle中的Union、Union All、Intersect、Minus 使用用法区别

      Oracle中的Union.Union All.Intersect.Minus 众所周知的几个结果集集合操作命令,今天详细地测试了一下,发现一些问题,记录备考. 假设我们有一个表Student,包 ...

  5. mysql 代替intersect_MySQL不支持INTERSECT和MINUS及其替代方法_MySQL

    bitsCN.com MySQL不支持INTERSECT和MINUS及其替代方法 Doing INTERSECT and MINUS in MySQL Doing an INTERSECTAn INT ...

  6. SQL Server里的INTERSECT

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

  7. Oracle中的Union、Union All、Intersect、Minus

    Oracle中的Union.Union All.Intersect.Minus  众所周知的几个结果集集合操作命令,今天详细地测试了一下,发现一些问题,记录备考. 假设我们有一个表Student,包括 ...

  8. 关于交集(Intersect)和差集(Except)

    函数经常会用到关于运算方面的东西.有时复杂的逻辑会变得更加容易理解. 在C#3.0,可以有几个方法推荐用用.实际场景如下: 代码         /// <summary>         ...

  9. Scala集合List的常用方法:take/flatMap/filter/zip/union/intersect/diff及WordCount集合实现

    take 跟limit作用一样 WordCount 结合flatMap flatMap扁平化 filter过滤 对集合中的元素进行过滤 zip拉链 union并集运算 intersect交集运算 di ...

最新文章

  1. 输入任意个整数以回车键结束_Enter键只知道回车作用?以下7个用法,你会几个?...
  2. 23 Merge k Sorted Lists
  3. 孩子有必要学python吗_不学就落后了?孩子都能学得Python编程,究竟是什么?
  4. HDU4633(Polya计数)
  5. 前端学习(2879):实现v-if和v-show设计分析 视图搭建
  6. linux克隆后重新封装,克隆后立即在OSX上修改Linux内核源代码
  7. 二级c语言统计小于n素数的个数,关于求N以内素数的一点小问题(N小于一亿)...
  8. idea文件为橙色去掉版本控制
  9. 桌面云计算: 提供灵活、可靠双保险
  10. Username is not in the sudoers file. This incident will be reported
  11. laravel插入数据时报 502 Bad Gateway
  12. C语言编写一个计算器(附全源代码)
  13. 2018年值得推荐的20个Bootstrap网站模板
  14. 【SPSS统计分析】SPSS聚类分析:一个案例演示聚类分析全过程(附SPSS 19.0中文版下载)
  15. cad编辑节点快捷键是什么_cad进入块编辑快捷键是什么,Auto CAD进入块编辑快捷键是什么?...
  16. 轻松教你苹果airdrop怎么用
  17. 数据分析之数据质量分析和数据特征分析
  18. FPGA基础知识----第三章 第2节 综合和仿真
  19. GCM与CCM的的规格和加解密过程
  20. 上海市高等学校计算机一级证书,上海市高等学校计算机等级考试(二级)

热门文章

  1. 使用TypeScript映射和条件类型使React组件更出色
  2. 两个主键怎么设置tsql_索引该怎么创建?
  3. 开机不进去桌面执行gui_电脑系统崩溃进不去,简单几步设置U盘,快速找回桌面重要文件...
  4. 1097 Deduplication on a Linked List
  5. UI设计培训分享:平面广告设计中的文案表达技巧
  6. 配置linux-Fedora系统下iptables防火墙
  7. JHipster开发环境安装
  8. docker的网络架构配置
  9. filter-mapping中的dispatcher使用
  10. 精品软件 推荐 瑞星 杀毒软件 安全软件