数据库环境:SQL SERVER 2008R2

Sql Server有提供求集合差集的函数——EXCEPT。先看看EXCEPT的用法,

{ <query_specification> | ( <query_expression> ) }
{ EXCEPT }
{ <query_specification> | ( <query_expression> ) } 从 EXCEPT 操作数左边的查询中返回右边的查询未返回的所有非重复值。
上面是摘自MSDN对EXCEPT函数的用法介绍。 在这里,我们的要求有点特别,集合B中存在多少条集合A的记录,那么,在集合A中剔除集合B中对应的记录条数。
假如A表有数据如下:
id    name
1     a
1     a
2     b B表数据如下:
id    name
1     a
3     c 根据需求,B表中有一条记录和A表有重复,因此,在A表中,把该重复记录的一条去掉,
结果数据如下:
id    name
1     a
2     b
需求已经清晰了,现在开始来实现实现的方法是:分别给a表和b表的重复记录编号,
只要在b表中存在和a表编号、id、name一样的记录,即在a表进行过滤。
先准备基础数据
WITH    a
AS ( SELECT 1 AS id ,
'a' AS NAME
UNION ALL
SELECT 1 AS id ,
'a' AS NAME
UNION ALL
SELECT 2 AS id ,
'b' AS NAME
UNION ALL
SELECT 3 AS id ,
'c' AS NAME
UNION ALL
SELECT 3 AS id ,
'c' AS NAME
UNION ALL
SELECT 1 AS id ,
'a' AS NAME
UNION ALL
SELECT 4 AS id ,
'd' AS NAME
),
b
AS ( SELECT 3 AS id ,
'c' AS NAME
UNION ALL
SELECT 1 AS id ,
'a' AS NAME
UNION ALL
SELECT 2 AS id ,
'b' AS NAME
UNION ALL
SELECT 3 AS id ,
'c' AS NAME
UNION ALL
SELECT 1 AS id ,
'a' AS NAME
)

分别来看一下a表和b表的数据

      

第一种方式,用NOT EXISTS来实现

SELECT  id ,
NAME
FROM ( SELECT id ,
ROW_NUMBER() OVER ( PARTITION BY id, NAME ORDER BY id ) AS nid ,
NAME
FROM a
) a
WHERE NOT EXISTS ( SELECT NULL
FROM ( SELECT id ,
ROW_NUMBER() OVER ( PARTITION BY id,
NAME ORDER BY id ) AS nid ,
NAME
FROM b
) b
WHERE b.nid = a.nid
AND b.id = a.id
AND b.NAME = a.NAME )

第二种实现方式,通过EXCEPT来实现

SELECT  id ,
NAME
FROM ( SELECT id ,
ROW_NUMBER() OVER ( PARTITION BY id, NAME ORDER BY id ) AS nid ,
NAME
FROM a
EXCEPT
SELECT id ,
ROW_NUMBER() OVER ( PARTITION BY id, NAME ORDER BY id ) AS nid ,
NAME
FROM b
) a

方法1和方法2本质上是一样的思路,只不过写法不同而已。

我们来看下结果

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFUAAABGCAIAAAAy1U84AAAC10lEQVR4nO2YsY6cMBCG551QCvMu0SmF/SB5AIvW3Rana0IqSzxEQEqLRJ27bU5i0y6SU3gXbDBwp5hZkP3LugUDN/78D2AGlFflef5mS4iqLEshKlHd2un0rJRSLFEsKcsyYYkQVZKwN5cAwLk96tEboxOcnXmet4bAO/+rLSGqhLGnp6eEMd00/8uvVlSVEJUQ1en0nCTsdU0AMNrVPWY/2Jpehc0/laadttULvWhz/j/71ub8x5Jn/sMJfvyUITfouu58uXa4wo84p8gf+SP/2mhqTgiv/UV1RKw5ASPGKKKkMDoKAFRa+/q4PmRoOMslF/+UFonfYLQjSgqU0qGj5oQQYp4MBv9nhron/wnn9G6XFbHmhMpOUnt2eL8vKaGUeOPv/4WZSyj8tRnapKXS6tKb9wmRlHDpuvADWuCvObm7ISkSv071CawextBnTZako4n7xO2/wD9yAIu/G/GMgCyTa06o1BPmTJwPaIf8Xc2JdT9bz3nCa/uX2DfHFvk/ejf9v5b59esOLNLJ0IZsp7LbhN9IPfNl40Nr/P2MTx48GnjhDT15/y8PPK7/In/kD5j/fLmG3OBWBgVA/rsTQdd1bdue3/9iNoBd1F0HfgDA5G/b9tHsSpn80f/o/2zLv8K3lyD9//39i15Ee+aP/h/D/6345/wv2PDdxgpE/t3532RpmjVo/DvxXzVZ2icAJv8+/C9YDx2k/wXr73pjKjD49+G/lf6o/HH9hwe/4D+yov/R//PlGrT/QyUoyBLYLf/xJx45olORP/JH/nV+74vxdX7k75+VofhejB+Iv8nSlDHPgzkOf8GAFd4HMxvxUfWPmRNuH+RY/E2W3gsAyN//zsM9NhK/GWYH+W8VI/zm4yH43QPzFXgmzi3/myx9fP6b48J+/qXpjvzfIjByRKcif+QPnV/Xv/ADI0d0qjXrXwFKKbWLOuwDFfnDVuQPW6Hz/wMYmZJZV6QB7wAAAABJRU5ErkJggg==" alt="" />

(本文完)

												

SQL求差集的更多相关文章

  1. hiveQL求差集

    hive sql求差集的方法 1.什么是差集 set1 - set2,即去掉set1中存在于set2中的数据. 2.hive中计算差集的方法,基本是使用左外链接. 直接上代码 select * fro ...

  2. 3亿(int)数据-2亿(int)数据 求差集

    两个大文本,每行一条int数据 3亿(int)数据-2亿(int)数据 求差集 原始(粗暴)办法 1redis set 或类似方案 本地内存 cpu都撑不住 2持久化两张表 sql join mysq ...

  3. Silverlight项目笔记6:Linq求差集、交集&检查网络连接状态&重载构造函数复用窗口

    1.使用Linq求差集.交集 使用场景: 需要从数据中心获得用户数据,并以此为标准,同步系统的用户信息,对系统中多余的用户进行删除操作,缺失的用户进行添加操作,对信息更新了的用户进行编辑操作更新. 所 ...

  4. 用SQL求1到N的质数和

    今天在百度知道中,遇到了一位朋友求助:利用sql求1到1000的质数和.再说今天周五下午比较悠闲,我就在MSSQL 2008中写了出来,现在分享在博客中,下面直接贴代码: declare @num i ...

  5. java8 集合求差集、并集、交集

    前言 java8里最大亮点是lambda,让我们用习惯C# linq的语法,也能眼前一亮.但是比起C#的语法糖还是差的很远. 差集.并集.交集 @Test public void test1(){ L ...

  6. 关于数组array_diff(array1, array2)求差集来比较数组是否相等的问题细究

    无意中发现很多朋友都喜欢使用array_diff(array1, array2)来判断两个数组是否相等, 我自己也偶尔会这么使用 但是今天我在写代码的过程中无意发现这么做是不准确的. 首先我们来看一下 ...

  7. List<model>需要根据特定字段求差集的实现

    list对象不能直接使用Except等封装好的函数,因为内存地址不一样(还有一些数虽然主数据一致但是update/create信息也不一致,对,我碰到的需求就是这么难受 TOT) 这时候我们的需求很多 ...

  8. python中列表之间求差集、交集、并集

    求两个列表的交集.并集.差集 def diff(listA, listB): # 求交集的两种方式 retA = [i for i in listA if i in listB] retB = lis ...

  9. Python求差集

    本月月初在职员工表(20来列,身份证.银行卡号等),本月离职员工表(10来列,计时.计件等),不考虑本月入职员工表,求下月月初在职员工表. Python,import pandas as pd,两个p ...

随机推荐

  1. [C#网络编程系列]专题一:网络协议简介

    转自:http://www.cnblogs.com/zhili/archive/2012/08/11/NetWorkProgramming.html 因为这段时间都在研究C#网络编程的一些知识, 所以 ...

  2. nini

    using Nini.Ini; using Nini.Config; IniDocument doc = new IniDocument("Settings.ini", IniFi ...

  3. 继续畅通工程 HDOJ--1879

    继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  4. Linux创建新用户以及useradd adduser的区别

    从阿里云那弄了个机子玩玩,系统用的是Ubuntu12.04.刚等上去时候是用root登录的,首先想到的就是创建一个用户. 使用 useradd myname 发现/home目录下没有myname的家目 ...

  5. [转]js动态创建json类型

    废话少说:json是一个特有的键值对数组类型.既然是数组类型那么我们就可以这样定义 1.先定义数组 var Data = []; 2.理解键值对 对象名:值{ "id": i, & ...

  6. Ubuntu---2

    1.Ubuntu学习笔记之:安装中文语言包 http://askubuntu.com/questions/59356/how-do-i-get-chinese-input-to-work

  7. 解析Qt4.7.3编译MySql数据库驱动,存中文乱码、过滤转义字符问题

    问题:使用QSqlDataBase类建立连接MySql数据库驱动加载失败 QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: available ...

  8. Javascript数据类型——undefined和null的异同

    Javascript的基本数据类型中有undefined和null两种只有一个值得特殊数据类型.其中undefined表示未被初始化,不是为声明.而null表示一个空对象指针,而这也是使用typeof ...

  9. 322. Coin Change

    动态规划里例题,硬币问题. p[i] = dp[i - coin[j]] + 1; 注意i < coin[j] dp[i-coin[j]]无解都要跳过. public class Solutio ...

  10. Spring Aop实现方式总结

    前面两个文章介绍了Aop及其相关重要概念,下面主要用代码的方式介绍下实现Spring Aop的几种方式 1. 基于注解实现Spring Aop 业务类接口 package cn.test.busine ...