SQL Server里的INTERSECT ALL
2015-08-10 08:05
381 查看
在上一篇文章里,我讨论了[b]INTERSECT[/b]设置操作的基础,它和[b]INNER JOIN[/b]的区别,还有为什么需要好的索引设计支持。今天我想谈下SQL Server里并未实现的[b]INTERSECT ALL[/b]操作。
[b]INTERSECT ALL[/b]是SQL特性的一部分,但SQL Server并不考虑它。和[b]INTERSECT[/b]操作的区别非常简单:INTERSECT ALL不会剔除重复行。在SQL Server里的好处是你可以模拟[b]INTERSECT ALL[/b]。我们来试下,再次创建2个表,并插入一些行。
你会发现,第2个表包含重复记录——在表里值为2的记录出现了2次。现在当你在2个表之间进行INTERSECT,值为2的记录在结果集只出现1次。重复行被剔除了。
如果你想保留重复行,你必须使它们唯一。这里的一个方法是使用自SQL Server 2005后引入的[b]ROW_NUMBER()[/b]窗口函数。使用这个函数你为每个重复记录生成唯一的行号。因此你的重复记录变成了唯一,“重复”行如期望的返回2次。下列代码显示了这个技术:
感谢关注!
[b]INTERSECT ALL[/b]是SQL特性的一部分,但SQL Server并不考虑它。和[b]INTERSECT[/b]操作的区别非常简单:INTERSECT ALL不会剔除重复行。在SQL Server里的好处是你可以模拟[b]INTERSECT ALL[/b]。我们来试下,再次创建2个表,并插入一些行。
-- Create the 1st table CREATE TABLE t1 ( Col1 INT, Col2 INT, Col3 INT ) GO -- Create the 2nd table CREATE TABLE t2 ( Col1 INT, Col2 INT ) GO -- Insert some records into both tables INSERT INTO t1 VALUES (1, 1, 1), (2, 2, 2), (2, 2, 2), (3, 3, 3) INSERT INTO t2 VALUES (2, 2), (2, 2), (3, 3) GO
你会发现,第2个表包含重复记录——在表里值为2的记录出现了2次。现在当你在2个表之间进行INTERSECT,值为2的记录在结果集只出现1次。重复行被剔除了。
如果你想保留重复行,你必须使它们唯一。这里的一个方法是使用自SQL Server 2005后引入的[b]ROW_NUMBER()[/b]窗口函数。使用这个函数你为每个重复记录生成唯一的行号。因此你的重复记录变成了唯一,“重复”行如期望的返回2次。下列代码显示了这个技术:
-- You can preserve duplicate rows by making them unique with the ROW_NUNBER() Windowing Function. WITH IntersectAll AS ( SELECT ROW_NUMBER() OVER (PARTITION BY Col1, Col2 ORDER BY (SELECT 0)) AS RowNumber, Col1, Col2 FROM t1 INTERSECT SELECT ROW_NUMBER() OVER (PARTITION BY Col1, Col2 ORDER BY (SELECT 0)) AS RowNumber, Col1, Col2 FROM t2 ) SELECT Col1, Col2 FROM IntersectAll GO
小结
SQL Server里[b]INTERSECT[/b]操作的一个副作用是重复行会剔除不会在结果集里返回。如果你想保留它们,你需要使它们唯一,例如应用[b]ROW_NUMBER() [/b]计算。感谢关注!
参考文章:
https://www.sqlpassion.at/archive/2015/02/16/intersect-sql-server-2/相关文章推荐
- Redis源代码分析(二十)--- ae事件驱动
- 第五篇 SQL Server安全架构和安全
- MongoDB 3.0新增特性一览
- 笔记:Mysql--Date型数据的存储
- mysql用户管理
- centos 安装 redis
- 构建施耐德楼控系统数据库后台服务器示例工程四(SQLServer查询语句)
- 构建施耐德楼控系统数据库后台服务器示例工程三(Web端展示)
- Mysql导入导出
- Microsoft Dynamics CRM server 2013 系统和SQL server 备份 为升级 CRM 2015版本准备
- Microsoft Dynamics CRM server 2013 系统和SQL server 备份 为升级 CRM 2015版本准备
- MySQL 学习笔记
- oracle 11g数据库安全加固注意事项
- mysql中一个普通ERROR 1135 (HY000)错误引发的血案
- 防御SQL注入的方法总结
- 数据库设计三大范式简析
- 跨数据库实现数据交流
- MySql查询不区分大小写解决方案(两种)
- oracle创建一个数据库三步走
- 19个MySQL性能优化要点解析