在集合论中,集合A与B的差集(A-B)是由属于集合A,但不属于集合B的元素组成的集合。可以认为两个集合的差A-B就是从A中减去B中也属于A的元素。

在T-SQL中,集合之差是用EXCEPT集合运算实现的。EXCEPT运算对两个输入查询的结果集进行操作,返回出现在第一个结果集中,但不出现在第二个结果集中的所有行。

EXCEPT DISTINCT 集合运算

EXCEPT 集合运算在逻辑上先删除两个输入多集中的重复行(把多集转变成集合),然后返回只在第一个集合中出现,在第二个集合中不出现所有行。换句话说,一个行能够被返回,仅当这个行在第一个输入的多集中至少出现一次,而且在第二个多集中没有出现过。

注意:EXCEPT 运算与其他两种集合运算不同,EXCEPT 是不对称的。亦即,对于其他两种集合运算,哪个输入查询放在前面,哪个输入查询放在后面是无关紧要的;但EXCEPT 集合运算就不是这样了。

SELECT country FROM dbo.Employees

EXCEPT

SELECT country FROM dbo.Customers

EXCEPT 运算也可以用其他方法来实现。一种方法是使用外联接,筛选出在联接左边出现而在右边不出现的外部行。另一种方法是使用 NOT EXISTS 谓词。

EXCEPT ALL集合运算

EXCEPT ALL 运算与EXCEPT运算非常类似,但它还考虑了每一行的出现次数。假设行R在第一个多集中出现了x次,在第二个多集中出现y次,且x>y,则在Query1 EXCEPT ALL Query2中,R出现 x-y次。换句话说,如果一个行在第一个多集中出现了多次,EXCEPT ALL 逻辑上只返回它在第二个多集中没有相应出现过的那些行。虽然 SQL Server 没有提供内建的EXCEPT ALL 运算,但用与INTERSECT ALL的解决方案类似的方法,也可以为EXCEPT ALL 提供替代的解决方案。也就是为每个输入查询增加一个ROW_Number计算,算出每行是第几次出现,再对两个输入集应用EXCEPT 运算。这样就只返回出现次数找不到匹配的行。

SELECT ROW_NUMBER() over(partition by country,region order by (SELECT 0)) as rownum,country

FROM dbo.Employees

EXCEPT

SELECT ROW_NUMBER() over(PARTITION BY country,region order by (SELECT 0)),country

FROM dbo.Customers

EXCEPT(差集)集合运算的更多相关文章

  1. 集合运算—union(并集)、intersect(交集)和except(差集)

    一.集合运算的基本格式是: 集合查询1 <集合运算> 集合查询2 [order by ...] 二.集合运算符是对两个集合操作的,两个集合必须具有相同的列数,列具有相同的数据类型(至少能隐 ...

  2. SQL集合运算 差集 并集 交

    SQL-3标准中提供了三种对检索结果进行集合运算的命令:并集UNION:交集INTERSECT:差集EXCEPT(在Oracle中叫做 MINUS).在有些数据库中对此的支持不够充分,如MySql中只 ...

  3. sql server 交集,差集的用法 (集合运算)

    概述 为什么使用集合运算: 在集合运算中比联接查询和EXISTS/NOT EXISTS更方便. 并集运算(UNION) 并集:两个集合的并集是一个包含集合A和B中所有元素的集合. 在T-SQL中.UN ...

  4. 【Java EE 学习 28 上】【oracle学习第二天】【子查询】【集合运算】【几种数据库对象】

    一.子查询 1.为什么要使用子查询:问题不能一步求解或者一个查询不能通过一步查询得到. 2.分类:单行子查询和多行子查询. 3.子查询的本质:一个查询中包含了另外一个或者多个查询. 4.使用子查询的规 ...

  5. 详解SQL集合运算

    以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化. 本系列[T-SQL基础]主要是针对T-SQL基础的总结. [T-SQL基础]01.单表查询-几道sql查询题 ...

  6. Oracle学习之集合运算

    一.集合运算操作符  UNION:(并集)返回两个集合去掉重复值的所有的记录  UNION ALL:(并集)返回两个集合去掉重复值的所有的记录 INTERSECT:(交集)返回两个集合的所有记录,重复 ...

  7. Oracle学习(七):集合运算

    1.知识点:能够对比以下的录屏进行阅读 SQL> -- 查询10和20号部门的员工的3种方法 SQL> --1. select * from emp where deptno in (10 ...

  8. [改善Java代码]集合运算时使用更优雅的方式

    在初中代数中,我们经常会求两个集合的并集.交集.差集等,在Java中也存在着此 类运算,那如何实现呢? 一提到此类集合操作,大部分的实现者都会说:对两个集合进行遍历,即可求出结果.是的,遍历可以实现并 ...

  9. sql的集合运算

    表的加减法 union:使用union 对表进行假发(并集)运算, union等集合运算符通常都会去除重复记录. select shohin_id, shohin_mei from shohin un ...

随机推荐

  1. 基于纯注解的spring开发的介绍

    几个核心注解的介绍1.@Configuration它的作用是:将一个java类修饰为==配置文件==,在这个java类进行组件注册1package com.kkb.config; import org ...

  2. Ubuntu下压缩与解压各种文件的命令

    1.压缩与解压xz文件 (1)压缩 xz -z  filename (2)解压 xz -d  filename.xz 2.压缩与解压tar文件 (1)压缩 tar -cvf  filename(压缩到 ...

  3. JDK的4种引用类型

    在java中,大致有以下几种引用类型,强引用(StrongReference).软引用(SoftReference).弱引用(WeakReference).虚引用(PhantomReference) ...

  4. docker-ce的安装

    Docker提供了两个版本:社区版(CE)和企业版(EE). Docker社区版(CE)是开发人员和小型团队开始使用Docker并尝试使用基于容器的应用的理想之选.Docker CE有两个更新渠道,即 ...

  5. 蓝牙bluez学习(1) Stack Architecture

    Bluez支持的features Core Specification 4.2 (GAP, L2CAP, RFCOMM, SDP, GATT) Classic Bluetooth (BR/EDR) B ...

  6. 在cmd 命令中 用cd E:\ 进入不了E盘 问题

    cd 路径 只能在本盘符中切换路径需要切换到e盘 需要cd /d e:\

  7. keepalived安装脚本

    keepalived_install.sh: #cat keepalived_install.sh #!/bin/bash pkg=keepalived-2.0.10.tar.gz tar xf $p ...

  8. cxLookupCombobox的多字段模糊匹配

    查了网上很多资料,懒人输入:通过程序使用过滤对话达到自己的目的: 用到cxFilter单元: cbb_DoctorOrder.Properties.View.DataController.Filter ...

  9. CactiI表结构和数据被动获取

    cacti我们也用了很久了,但是它的表结构一直都没有去关心过,得空抽了半个晚上的时间,把它的库表结构大概看了下,某些字段的含义跟大家分享下:cacti的数据都是存放在rrdtool中的,数据库存放的其 ...

  10. nginx1.6.3

    Nginx1.6.3安装配置 安装时关闭防火墙和selinuxservice iptables stopsed -i "s/selinux=enabled/selinux=disable/g ...