数据库环境: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. 【Android 复习】:第02期:引导界面(二)使用ViewPager实现欢迎引导页面

    一.实现的效果图 也许是养成了这样一个习惯,每次看别人的代码前,必须要先看实现的效果图达到了一个什么样的效果,是不是跟自己想要实现的效果类似,有图才有真相嘛,呵呵.           二.编码前的准 ...

  2. log4net封装类 zz

    封装说明: 1.使用静态方法调用即可写入日志. 2.在日志信息写入之前,定义委托处理日志信息,便于记录日志信息之前,显示给用户. 3.添加代码配置Log4net,避免应用程序总是携带配置文件.如果需要 ...

  3. Web---HTTP请求、重定向、转发和数据压缩

    HTTP常用的请求方式包括: GET-最为常见,但发送的数据量很小,发送的数据直接包含到url的后面. POST-可以包含大量数据,数据在请求正文中通过表单进行提交. HEAD,PUT,DELETE. ...

  4. HDOJ/HDU 1372 Knight Moves(经典BFS)

    Problem Description A friend of you is doing research on the Traveling Knight Problem (TKP) where yo ...

  5. CodeForces 573A Bear and Poker

    题目链接:http://codeforces.com/problemset/problem/573/A 题目大意:此题要求一组数中的元素乘以2或者乘以3后得到的数都一样,其实就是判断这些数除去2和3这 ...

  6. Bzoj 1982: [Spoj 2021]Moving Pebbles 博弈论

    1982: [Spoj 2021]Moving Pebbles Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 130  Solved: 88[Submi ...

  7. make it clear how to use const in C++

    1.first of all,take a lookup on the left side of keyword const.If there is something(type or pointer ...

  8. No valid host was found

    set in nova.conf -> scheduler_default_filters=AllHostsFilter Tried without success.

  9. PHP如何让apache支持.htaccess 解决Internal Server Error The server …错误

    TP框架  打开 www.newtp.com/index.php/Home/Index/abc出现 如下错误: Internal Server Error The server encountered ...

  10. jQuery 简单归纳总结

    jQuery语法是为HTML元素的选取编制的,能够对元素运行某些操作. 基础语法是:$(selector).action() +美元符号定义 jQuery +选择符(selector)"查询 ...