`
zealotds
  • 浏览: 124024 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

【Microsoft SQL Server 2008 技术内幕:T-SQL语言基础】四、集合运算

阅读更多
sql2008 t-sql

集合运算 (Set Operations)

UNION 并集
  • UNION [DISTINCT]:求并集,删除重复行(隐含DISTINCT)
  • UNION ALL:求并集,不比较,不删除重复行

INTERSECT 交集
  • INTERSECT [DISTINCT]:求交集(隐含DISTINCT),删除重复行
  • INTERSECT ALL (Sql Server不支持):求交集,返回有重复行,但只返回重复行数较少的那个多集(参与交集运算的集合)的所有重复行。假如行R在多集A中重复出现x次,在多集B中重复出现y次,则R在结果集中出现min(x, y)次。

EXCEPT 差集,可使用外联或NOT EXISTS实现
  • EXCEPT [DISTINCT]:求差集(隐含DISTINCT),删除重复行
  • EXCEPT ALL (Sql Server不支持):求差集,返回有重复行。假如行R在第一个多集中重复出现x次,在第二个多集中重复出现y次,x>y,则R在结果集中出现x-y次。

优先级:
  • INTERSECT > ( UNION = EXCEPT )

集合运算的限制:
  • 参与结合运算的表表达式中无法使用ORDER BY,ORDER BY只能作用于集合运算的结果。
  • 但如果要想在参与集合运算的表表达式中使用TOP来限制行数,就需要使用表表达式将包含ORDER BY的查询包装一次。这种情况下ORDER BY只为TOP提供逻辑服务,并不控制结果的排序。

 -- ================================================== 
 -- Sql Server INTERSECT ALL workaround
 -- ==================================================
 with INTERSECT_ALL as (
	 select ROW_NUMBER() over (
		partition by region, country, city
		order by (select 0)
	  ) as rownum -- only those intersection(smaller) RowNum will remain
	  , region
	  , country
	  , city
	from HR.Employees
	INTERSECT
	select ROW_NUMBER() over (
		partition by region, country, city
		order by (select 0)
	  ) as rownum -- only those intersection(smaller) RowNum will remain
	  , region
	  , country
	  , city  
	from Sales.Customers
) 
select country, region, city
from INTERSECT_ALL


 -- ================================================== 
 -- Sql Server EXCEPT ALL workaround
 -- ==================================================
 with EXCEPT_ALL as (
	 select ROW_NUMBER() over (
		partition by region, country, city
		order by (select 0)
	  ) as rownum -- intersection(smaller) RowNum will be removed
	  , region
	  , country
	  , city
	from HR.Employees
	EXCEPT
	select ROW_NUMBER() over (
		partition by region, country, city
		order by (select 0)
	  ) as rownum -- intersection(smaller) RowNum will be removed
	  , region
	  , country
	  , city  
	from Sales.Customers
) 
select country, region, city
from EXCEPT_ALL

-- ================================================== 
-- Using ORDER BY inside set operation
-- ==================================================
select empid, orderid, orderdate
from (
  select top(2) empid, orderid, orderdate
  from Sales.Orders
  where empid = 3
  order by orderdate desc, orderid desc
) as D1
union all
select empid, orderid, orderdate
from (
  select top(2) empid, orderid, orderdate
  from Sales.Orders
  where empid = 5
  order by orderdate desc, orderid desc
) as D2

0
0
分享到:
评论

相关推荐

    Microsoft SQL Server 2008技术内幕:T-SQL查询(第二卷)

     作为一本讲述T-SQL高级查询的专业图书,《Microsoft SQL Server 2008技术内幕:T-SQL查询》旨在结合实践中的各种常见问题,教读者如何用SQL作为语言工具来思考问题,揭示基于集合查询的强大威力。《Microsoft SQL ...

    (第二卷)Microsoft SQL Server 2008技术内幕:T-SQL语言基础

     《Microsoft SQL Server 2008技术内幕:T-SQL语言基础》是Microsoft SQL Server 2008系列中的一本。书中全面深入地介绍了T-SQL的基本元素,以及SQL Server 2008中新增加的一些特性。主要包括SQL的基础理论、逻辑...

    (第一卷)Microsoft.SQL.Server.2008技术内幕:T-SQL语言基础

     《Microsoft SQL Server 2008技术内幕:T-SQL语言基础》是Microsoft SQL Server 2008系列中的一本。书中全面深入地介绍了T-SQL的基本元素,以及SQL Server 2008中新增加的一些特性。主要包括SQL的基础理论、逻辑...

    Microsoft+SQL+Server+2008技术内幕:T-SQL查询_源代码及附录 中文版

    《Microsoft SQL Server 2008技术内幕:T-SQL查询》全面深入地介绍了Microsoft SQL Server 2008中高级T-SQL查询、性能优化等方面的内容,以及SQL Server 2008新增加的一些特性。主要内容包括SQL的基础理论、查询优化...

    Microsoft SQL Server 2005技术内幕:T-SQL查询

    第1章 T-SQL查询和编程基础  1.1 理论背景  1.2 SQL SERVER体系结构  1.3 创建表和定义数据完整性  1.4 总结 第2章 单表查询  2.1 SELECT语句的元素  2.2 谓词和运算符  2.3 CASE表达式  2.4 NULL...

    SQLServer2008技术内幕T-SQL查询包含源代码及附录A

    《Microsoft SQL Server 2008技术内幕:T-SQL查询》全面深入地介绍了Microsoft SQL Server 2008中高级T-SQL查询、性能优化等方面的内容,以及SQL Server 2008新增加的一些特性。主要内容包括SQL的基础理论、查询优化...

    Microsoft SQL SERVER 2008技术内幕 T-SQL查询

    《Microsoft SQL Server 2008技术内幕:T-SQL查询》是一本深入探讨SQL Server 2008中T-SQL查询技术的专业书籍。本书旨在帮助读者掌握如何有效地使用Transact-SQL(T-SQL)进行数据检索、操作、查询优化以及数据库...

    sqlserver集合运算.sql

    Microsoft SQL Server 2008技术内幕:T-SQL语言基础(集合运算)练习sql文件

Global site tag (gtag.js) - Google Analytics