SQL Server中的集合运算包括UNION
(合并),EXCEPT
(差集)和INTERSECT
(相交)三种。
集合运算的基本使用
1.UNION
(合并两个查询结果集,隐式DINSTINCT,删除重复行)
--合并两个提取表/派生表(derived table), 返回结果为:[a,b,c,d,e] SELECT FC FROM (VALUES('a'),('b'),('c'),('e')) Table1 (FC) UNION SELECT FC FROM (VALUES('a'),('b'),('c'),('d')) Table2 (FC)
2.UNION ALL
(简单合并两个查询结果集,不删除重复行)
--提取表/派生表(derived table)可以是多列,列名、顺序可以不同,但列数必须相同 SELECT * FROM (VALUES('a','Anna'),('b','Bob'),('c','Cassie'),('e','Elina')) Table1 (FC, Name) UNION ALL SELECT * FROM (VALUES('a','Anna'),('b','Bob'),('c','Cassie'),('d','David')) Table2 (FC, Name)
3.EXCEPT
(返回出现在第一个结果集但不出现在第二个结果集中的所有行)
--返回结果为:[e] SELECT FC FROM (VALUES('a'),('b'),('c'),('e')) Table1 (FC) EXCEPT SELECT FC FROM (VALUES('a'),('b'),('c'),('d')) Table2 (FC)
4.INTERSECT
(返回第一个查询结果集和第二个查询结果集共有的部分)
--返回结果为:[a,b,c] SELECT FC FROM (VALUES('a'),('b'),('c'),('e')) Table1 (FC) INTERSECT SELECT FC FROM (VALUES('a'),('b'),('c'),('d')) Table2 (FC)
集合运算的使用场景
1.使用UNION
代替Where
子句中的OR
,查询速度更快
--使用Where子句 + OR SELECT name, population, area FROM world WHERE area > 3000000 OR population > 25000000 --使用UNION SELECT name, population, area FROM world WHERE area > 3000000 UNION SELECT name, population, area FROM world WHERE population > 25000000
2.使用EXCEPT
和INTERSECT
, 过滤出列表中不存在/存在于数据库中的项
假设存在表Customers
, 数据如下表所示
cust_id
cust_name
cust_address
cust_city
cust_state
cust_country
cust_contact
cust_email
1000000001
Village Toys
200 Maple Lane
Detroit
MI
USA
John Smith
sales@villagetoys.com
1000000002
Kids Place
333 South Lake Drive
Columbus
OH
USA
Michelle Green
NULL
1000000003
Fun4All
1 Sunny Place
Muncie
IN
USA
Jim Jones
jjones@fun4all.com
1000000004
Fun4All
829 Riverside Drive
Phoenix
AZ
USA
Denise L. Stephens
dstephens@fun4all.com
1000000005
The Toy Store
4545 53rd Street
Chicago
IL
USA
Kim Howard
NULL
--过滤出列表中不存在于数据库中的项 --返回结果为['1000000006','1000000007'] SELECT [Id] AS [cust_id] FROM ( VALUES('1000000004'),('1000000005'),('1000000006'),('1000000007') ) dt ([Id]) EXCEPT SELECT [cust_id] FROM [Customers] --过滤出列表中存在于数据库中的项 --返回结果为['1000000004','1000000005'] SELECT [Id] AS [cust_id] FROM ( VALUES('1000000004'),('1000000005'),('1000000006'),('1000000007') ) dt ([Id]) INTERSECT SELECT [cust_id] FROM [Customers]
--对于SQLServer 2008以前的版本 SELECT [Id] AS [cust_id] FROM ( SELECT '1000000004' UNION ALL SELECT '1000000005' UNION ALL SELECT '1000000006' UNION ALL SELECT '1000000007' ) dt ([Id]) INTERSECT --EXCEPT SELECT [cust_id] FROM [Customers]
//使用C#动态生成SQL语句 var list = new List<string>(){"1000000004","1000000005","1000000006","1000000007"}; string sqlQuery = string.Format($@" SELECT [Id] AS [cust_id] FROM ( VALUES('{string.Join("'),('", list)}') ) dt ([Id] INTERSECT --EXCEPT SELECT [cust_id] FROM [Customers]" );
更多参考
Set Operators - EXCEPT and INTERSECT
Set Operators - UNION
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
- 黄乙玲1988-无稳定的爱心肝乱糟糟[日本东芝1M版][WAV+CUE]
- 群星《我们的歌第六季 第3期》[320K/MP3][70.68MB]
- 群星《我们的歌第六季 第3期》[FLAC/分轨][369.48MB]
- 群星《燃!沙排少女 影视原声带》[320K/MP3][175.61MB]
- 乱斗海盗瞎6胜卡组推荐一览 深暗领域乱斗海盗瞎卡组分享
- 炉石传说乱斗6胜卡组分享一览 深暗领域乱斗6胜卡组代码推荐
- 炉石传说乱斗本周卡组合集 乱斗模式卡组最新推荐
- 佟妍.2015-七窍玲珑心【万马旦】【WAV+CUE】
- 叶振棠陈晓慧.1986-龙的心·俘虏你(2006复黑限量版)【永恒】【WAV+CUE】
- 陈慧琳.1998-爱我不爱(国)【福茂】【WAV+CUE】
- 咪咕快游豪礼放送,百元京东卡、海量欢乐豆就在咪咕咪粉节!
- 双11百吋大屏焕新“热”,海信AI画质电视成最大赢家
- 海信电视E8N Ultra:真正的百吋,不止是大!
- 曾庆瑜1990-曾庆瑜历年精选[派森][WAV+CUE]
- 叶玉卿1999-深情之选[飞图][WAV+CUE]