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 ...
随机推荐
- Entity Framework 学习初级篇2--ObjectContext类的介绍
转自:http://www.cnblogs.com/Tally/archive/2012/09/14/2685014.html 本节,简单的介绍EF中的ObjectContext.ObjectQuer ...
- selenium webdriver(3)---操作页面对象
页面对象的相关操作可以通过接口文件org.openqa.selenium.WebElement查看,本文只是对象接口的使用方式,具体的实现方式在org.openqa.selenium.remote.R ...
- ARM学习笔记9——ARM汇编汇编语言中的伪指令
ARN汇编器支持ARM伪指令,这些伪指令在汇编阶段被翻译成ARM或Thumb指令.ARM伪指令包含ADR.ADRL.MOV32和LDR.一.ADR伪指令 1.作用 ADR是小范围地址读取伪指令,基于P ...
- 理解c++11正则表达式 (1)
概要 C++11提出了正则表达式这个概念,只需在头文件中包含#include<regex>即可.我们可以完成: Match 将整个输入拿来比对匹配某个正则表达式 Search 查找与正则表 ...
- ubuntu64bits环境下搭建Opencl的环境
此文介绍 ubuntu 平台下配置 AMD/ATI Opencl 环境,我是ubuntu 12.04. 主要分为六个步骤: 1. Take a look at your hardware to mak ...
- python-面向对象(一)——开篇基础
面向对象编程(Object Oriented Programming,OOP,面向对象程序设计) 一.创建类和对象 面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现, ...
- linux内核--几个上下文(context)
为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行,这种行为叫进程切换(process switch),任务切换(task switch)或上下文切换(con ...
- WinForm TextBox自定义扩展方法数据验证
本文转载:http://www.cnblogs.com/gis-crazy/archive/2013/03/17/2964132.html 查看公司项目代码时,存在这样一个问题:winform界面上有 ...
- 在Excel里如何将多个工作簿合并到一个工作簿中
在Excel里如何将多个工作簿合并到一个工作簿中 当你必须将多个工作簿合并到一个工作簿时,你遇到过麻烦吗?最让人心烦的就是需要合并的工作簿里有很多张工作表.有人能推荐方法解决这个问题吗? 利用VBA ...
- POJ 1006 Biorhythms(中国剩余定理)
题目地址:POJ 1006 学习了下中国剩余定理.參考的该博客.博客戳这里. 中国剩余定理的求解方法: 假如说x%c1=m1,x%c2=m2,x%c3=m3.那么能够设三个数R1,R2,R3.R1为c ...