SQL求差集
数据库环境: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求差集的更多相关文章
- hiveQL求差集
hive sql求差集的方法 1.什么是差集 set1 - set2,即去掉set1中存在于set2中的数据. 2.hive中计算差集的方法,基本是使用左外链接. 直接上代码 select * fro ...
- 3亿(int)数据-2亿(int)数据 求差集
两个大文本,每行一条int数据 3亿(int)数据-2亿(int)数据 求差集 原始(粗暴)办法 1redis set 或类似方案 本地内存 cpu都撑不住 2持久化两张表 sql join mysq ...
- Silverlight项目笔记6:Linq求差集、交集&检查网络连接状态&重载构造函数复用窗口
1.使用Linq求差集.交集 使用场景: 需要从数据中心获得用户数据,并以此为标准,同步系统的用户信息,对系统中多余的用户进行删除操作,缺失的用户进行添加操作,对信息更新了的用户进行编辑操作更新. 所 ...
- 用SQL求1到N的质数和
今天在百度知道中,遇到了一位朋友求助:利用sql求1到1000的质数和.再说今天周五下午比较悠闲,我就在MSSQL 2008中写了出来,现在分享在博客中,下面直接贴代码: declare @num i ...
- java8 集合求差集、并集、交集
前言 java8里最大亮点是lambda,让我们用习惯C# linq的语法,也能眼前一亮.但是比起C#的语法糖还是差的很远. 差集.并集.交集 @Test public void test1(){ L ...
- 关于数组array_diff(array1, array2)求差集来比较数组是否相等的问题细究
无意中发现很多朋友都喜欢使用array_diff(array1, array2)来判断两个数组是否相等, 我自己也偶尔会这么使用 但是今天我在写代码的过程中无意发现这么做是不准确的. 首先我们来看一下 ...
- List<model>需要根据特定字段求差集的实现
list对象不能直接使用Except等封装好的函数,因为内存地址不一样(还有一些数虽然主数据一致但是update/create信息也不一致,对,我碰到的需求就是这么难受 TOT) 这时候我们的需求很多 ...
- python中列表之间求差集、交集、并集
求两个列表的交集.并集.差集 def diff(listA, listB): # 求交集的两种方式 retA = [i for i in listA if i in listB] retB = lis ...
- Python求差集
本月月初在职员工表(20来列,身份证.银行卡号等),本月离职员工表(10来列,计时.计件等),不考虑本月入职员工表,求下月月初在职员工表. Python,import pandas as pd,两个p ...
随机推荐
- wpa_supplicant对wep,wpa,wpa2的psk和隐藏ap的scan_ssid扫描配置
# 请不要修改下面这一行内容,否则将不能正常工作ctrl_interface=/var/run/wpa_supplicant # 确保只有root用户能读取WPA的配置ctrl_interface_g ...
- Android学习笔记(十一)BroadcastReceiver动态注册、注销示例
在上一篇博文中简单介绍了一下BroadcastReceiver的相关知识点,本篇举一个在代码中动态的注册.注销BroadcastReceiver的栗子. 1.首先创建一个MyReceiver并继承Br ...
- 【转载】zookeeper 分布式锁 实现
agapple 基于zookeeper的分布式lock实现 博客分类: opensource java distributed 背景 继续上一篇文章:http://agapple.iteye. ...
- windows下Qt5.1 for android开发环境配置(PS:Qt5.2出来了哈,稳定)
说明:以下开发环境配置过程参考了这些文章: http://qt-project.org/wiki/building_qt-android_on_windows http://www.hyarm.com ...
- Java的MongoDB驱动及读写策略
网上看见一篇博文,详细讲了MongoDB读写策略,将来生产会遇到类似的问题,转来备查. 指定新mongo实例: Mongo m = new Mongo(); Mongo m = new Mongo( ...
- PAT 1004. Counting Leaves (30)
A family hierarchy is usually presented by a pedigree tree. Your job is to count those family membe ...
- 备忘--简单比较SPSS、RapidMiner、KNIME以及Kettle四款数据分析工具
SPSS.RapidMiner.KNIME以及Kettle四款工具都可以用来进行数据分析,只是彼此有各自的侧重点和有劣势.它们都可以逐步的定义数据分析过程,也同样都可以对数据进行ETL处理.笔者从自己 ...
- MVC 音乐商店 第 9 部分: 注册和结帐
MVC 音乐商店是介绍,并分步说明了如何使用 ASP.NET MVC 和 Visual Studio 为 web 开发教程应用程序. MVC 音乐商店是一个轻量级的示例存储实现它卖音乐专辑在线,并实现 ...
- 手动安装 mysqldb 与[ pip easy_install]
mysqldb下载: http://sourceforge.net/projects/mysql-python/ https://sourceforge.net/projects/mysql-pyth ...
- Cocos2d的特性
从本质上说,Cocos2d是一个图形引擎,封装了复杂的图形接口,通过抽象出精灵.动作等概念,降低了游戏开发难度,简化了开发过程.Cocos2d-x为保证游戏能方便地移植到不同平台上,又在此基础上做了很 ...