SQL SERVER: 合并相关操作(Union,Except,Intersect) - 转载
SQL Server 中对于结果集有几个处理,值得讲解一下
1. 并集(union,Union all)
这个很简单,是把两个结果集水平合并起来。例如
SELECT * FROM A
UNION
SELECT * FROM B
【注意】union会删除重复值,也就是说A或B中重复的数据行,最终只会出现一次,而union all则会保留重复行。
2. 差异(Except)
就是两个集中不重复的部分。例如
SELECT * FROM A
EXCEPT
SELECT * FROM B
这个的意思是,凡是不出现在B表中的A表的行。
【注意】except也会删除重复值,也就是说A中重复的数据行,最终只会出现一次,而且except不支持all语句
3. 交集(intersect)
就是两个集中共同的部分。例如
SELECT * FROM A
INTERSECT
SELECT * FROM B
这个的意思是,同时出现在A和B中的记录
【注意】intersect也会删除重复值,也就是说同时出现在A和B中重复的数据行,最终只会出现一次,而且intersect也不支持all语句
本文由作者:陈希章 于 2009/6/26 18:31:02 发布在:http://www.cnblogs.com/chenxizhang/ 本文版权归作者所有,可以转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 更多博客文章,以及作者对于博客引用方面的完整声明以及合作方面的政策,请参考以下站点:陈希章的博客中心 本文是使用博客同步和管理系统自动于2009/6/26 18:31:04 从 陈希章@博客园 同步过来的。原文地址: http://www.cnblogs.com/chenxizhang/archive/2009/06/26/1511889.html ,发表于2009/6/26 10:31:00.
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/chen_xizhang/archive/2009/06/26/4301621.aspx
UNION, EXCEPT 和 INTERSECT使用方法:
SQL中的UNION, EXCEPT 和 INTERSECT做下演示:
- 所有查询中的列数和列的顺序必须相同.
- 数据类型必须兼容.
并且它们都是处理于多个结果集中有重复数据的问题
首先还是创建测试环境
use tempdb create table tempTable1 (id int primary key identity, price int) create table tempTable2 (id int primary key identity, price int) insert into tempTable1 select 3 union all select 1 union all select 2 union all select 3 insert into tempTable2 select 3 union all select 4 union all select 1 union all select 2 select * from temptable1 select * from temptable2
两个表的初始结果如下
非常简单的两个表,列数和列顺序一样. 只要保证有数据完全一致,就可以说他们是重复的数据, 这样用上面3个运算词才会有效.
先来看看UNION和UNION ALL
select * from temptable1 union select * from temptable2 select * from temptable1 union all select * from temptable2
有 ALL 关键字是完全整合两个结果集,而无 ALL 是在之前的基础上去重了,所以第一个查询中{id:1, price:3}只会显示一条,结果如下:
在来看看EXCEPT, 也是去重的, 但是它在去掉两个或多个集合中重复数据的之后, 只会保留第一个结果集中的数据
select * from temptable1 except select * from temptable2
其实也是查询表A, 看表A的数据在表B中是否存在, 如果存在, 则删掉
而INTERSECT比较好理解, 就是查询两个结果集的并集, 利用上面的数据,查询到的结果只有一条, 就是{id:1, price:3}, 这里就不给出代码和结果图
注意UNION是对合并后的整个结果集去重
我们运行下面的语句
SELECT * FROM ( SELECT 1 AS ID,N'A' AS NAME UNION ALL SELECT 1 AS ID,N'A' AS NAME UNION ALL SELECT 1 AS ID,N'A' AS NAME ) AS T UNION SELECT * FROM ( SELECT 1 AS ID,N'A' AS NAME UNION ALL SELECT 2 AS ID,N'B' AS NAME ) AS T
结果如下:
其效果相当于:
SELECT DISTINCT * FROM ( SELECT * FROM ( SELECT 1 AS ID,N'A' AS NAME UNION ALL SELECT 1 AS ID,N'A' AS NAME UNION ALL SELECT 1 AS ID,N'A' AS NAME ) AS T UNION ALL SELECT * FROM ( SELECT 1 AS ID,N'A' AS NAME UNION ALL SELECT 2 AS ID,N'B' AS NAME ) AS T ) AS Temp
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架