`
java-mans
  • 浏览: 11415938 次
文章分类
社区版块
存档分类
最新评论

SQL集合操作Union实现

 
阅读更多

Union的语义是把两部分查询的结果合并起来,最终结果的列名和类型定义与第一个查询一致。Union语句可以是Union All或者Union Distinct,默认情况下最好采用前者,即只有Union关键字时等价于Union All。下面看看Union All/Union Distinct的例子。

表A 表B

1

2

3

4

3

4

3

4

5

6

3

4

3

4

7

8

UnionAll

1

2

3

4

3

4

3

4

5

6

3

4

3

4

7

8

UnionDistinct

1

2

3

4

5

6

7

8


MergeUnion

ALL

如果是Union All,那么MergeUnion的两个输入表没有必要是有序的,MergeUnion只需要先输出第一个表的数据,再输出第二个表的数据就可以了。

Distinct

如果是Union Distinct,MergeUnion算法要求两个输入表数据都有相同的排序。假设两个输入表的行数分别为M、N,则MergeUnion算法复杂度为O(M+N)。

具体实现如下:

1.如果第一个表的当前元组小于第二个表的当前元组,或者第二个表结束,那么输出第一个表的元组,且跳过相等的元组。

2.如果第一个表的当前元组大于第二个表的当前元组,或者第一个表结束,那么输出第二个表的元组,且跳过相等的元组。

3.如果第一个表的当前元组等于第二个表的当前元组,那么输出第一个表的元组,且跳过第一个和第二个表的相同元组。

4 如果两个表都结束,则返回结束。


其余思想类似。前提都是需要排序。不排序,则可以采用Hash的思路。思路见SQL Distinct的实现




-----


SQL集合运算 差集 并集 交集的入门介绍:

附文来源:http://www.cnblogs.com/shengtianlong/archive/2010/12/03/1895346.html


SQL集合运算 差集 并集 交集

SQL-3标准中提供了三种对检索结果进行集合运算的命令:并集UNION;交集INTERSECT;差集EXCEPT(在Oracle中叫做 MINUS)。在有些数据库中对此的支持不够充分,如MySql中只有UNION,没有其他两种。实际上这些运算都可以通过普通的SQL来实现,虽然有时有些繁琐。

假设有两个表(或视图)s,t,s中有两个字段sa,sb;t中有两个字段ta,tb;

差集EXCEPT:

PLAIN TEXT
SQL:
  1. SELECTsaFROMs
  2. EXCEPT
  3. SELECTtaFROMt;

可以写作

PLAIN TEXT
SQL:
  1. SELECTsaFROMs
  2. WHEREsaNOTIN
  3. (SELECTtaFROMt)

上面的例子中忽略了对s和t单独的条件,这些总可以加入AND条件完成,或者使用视图。如果是多个字段比较麻烦,如:

PLAIN TEXT
SQL:
  1. SELECTsa, sbFROMs
  2. EXCEPT
  3. SELECTta, tbFROMt;

需要写成

PLAIN TEXT
SQL:
  1. SELECTsa, sbFROMs
  2. WHERE(sa, sb)NOTIN
  3. (SELECTta, tbFROMt)

上面使用的语法不见得数据库都支持。好在不支持EXCEPT的MySQL支持这种语法,而不支持这种语法的MSSQL又支持EXCEPT。

注意对于这样的row constructors(Mysql术语),是和下面写法(以及其他类似写法)不等价的。

PLAIN TEXT
SQL:
  1. SELECTsa, sbFROMs
  2. WHEREsaNOTIN
  3. (SELECTtaFROMt)
  4. ANDsbNOTIN
  5. (SELECTtbFROMt)

在MSSQL中的一个解决技巧是,把这两个字段(假设字符类型)拼起来,即

PLAIN TEXT
SQL:
  1. SELECTsa, sbFROMs
  2. WHEREsa+sbNOTIN
  3. (SELECTta+tbFROMt)

交集INTERSECT:

PLAIN TEXT
SQL:
  1. SELECTsaFROMs
  2. INTERSECT
  3. SELECTtaFROMt;

可以写成

PLAIN TEXT
SQL:
  1. SELECTsaFROMs
  2. WHEREsaIN
  3. (SELECTtaFROMt)

当然也可以写成

PLAIN TEXT
SQL:
  1. SELECTsaFROMs
  2. WHEREEXISTS
  3. (SELECT*FROMtWHEREt.ta=s.sa)

或者使用连接

PLAIN TEXT
SQL:
  1. SELECTsaFROMs, t
  2. WHEREsa = ta

实际上这几个语句都有点问题,就是INTERSECT在出现重复时的语义问题。按照SQL-3标准,类似UNION,可以有明确的 INTERSECT ALL或者INTERSECT DISTINCT语法。一般的INTERSECT实现并没有明确这一点,而且从逻辑上讲意义也不大。那么当s或t中出现重复的时,如sa='x'的有2 个,sb='x'的有3个,使用上面的子查询将返回2行,使用连接将返回6行,当然这两个语句都可以加上一个DISTINCT,就实现了 INTERSECT DISTINCT语义了。

并集UNION:

MySql从4.0开始就支持UNION(ALL 和 DISTINCT)了,为完整起见,也列举一下。
其实实现这样一个结果是很麻烦的

PLAIN TEXT
SQL:
  1. SELECTsaFROMs
  2. UNIONDISTINCT
  3. SELECTtaFROMt;

需要使用外连接,而且是Full的外连接

PLAIN TEXT
SQL:
  1. SELECTDISTINCTNVL(s.sa, t.ta)
  2. FROMs FULLOUTERJOINtON(s.sa=t.ta)

上面的例子中我使用了Oracle的语法,实际上MySql不支持FULL OUTER JOIN(虽然支持LEFT和RIGHT OUTER JOIN),好在MySql支持UNION。

对于UNION ALL语义,我还没有想出来用普通查询如何实现,如果在上面语句中去掉DISTINCT,结果肯定不对。

标签:集合,差集

分享到:
评论

相关推荐

    关于SQL操作命令的一些集合.适合初学者用

    A: UNION 运算符 UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一...

    SQL Server中的集合运算: UNION, EXCEPT和INTERSECT示例代码详解

    SQL Server中的集合运算包括UNION(合并),EXCEPT(差集)和INTERSECT(相交)三种。 集合运算的基本使用 1.UNION(合并两个查询结果集,隐式DINSTINCT,删除重复行) --合并两个提取表/派生表(derived table), 返回结果为:...

    精通SQL--结构化查询语言详解

    10.2.2 in子查询实现集合交和集合差运算 191 10.2.3 exists子查询 192 10.2.4 exists子查询实现两表交集 194 10.2.5 some/all子查询 195 10.2.6 unique子查询 197 10.3 相关子查询 198 10.3.1 使用in引入相关...

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

    6.1 UNION(并集)集合运算 6.2 INTERSECT(交集)集合运算 6.3 EXCEPT(差集)集合运算 6.4 集合运算的优先级 6.5 避开不支持的逻辑查询处理 6.6 总结 6.7 练习 6.8 解决方案 第7章 透视、逆透视及分组集 ...

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

    6.1 UNION(并集)集合运算 6.2 INTERSECT(交集)集合运算 6.3 EXCEPT(差集)集合运算 6.4 集合运算的优先级 6.5 避开不支持的逻辑查询处理 6.6 总结 6.7 练习 6.8 解决方案 第7章 透视、逆透视...

    初步介绍MySQL中的集合操作

    MySQL数据库支持两种集合操作:UNION DISTINCT和UNION ALL。 与联接操作一样,集合操作也是对两个输入进行操作,并生成一个虚拟表。在联接操作中,一般把输入表称为左输入和右输入。集合操作的两个输入必须拥有相同...

    精通sql结构化查询语句

    22.4.1 连接数据表的实现 22.4.2 算术运算符的应用 22.4.3 表达式的应用 22.5 数据维护操作的应用 22.5.1 添加数据的实现 22.5.2 更新数据的实现 22.5.3 删除数据的实现 22.6 小结第23章 PHP访问 SQL Server 2005 ...

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

     6.1 UNION(并集)集合运算  6.2 INTERSECT(交集)集合运算  6.3 EXCEPT(差集)集合运算  6.4 集合运算的优先级  6.5 避开不支持的逻辑查询处理  6.6 总结  6.7 练习  6.8 解决方案 第7章 透视、...

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

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

    sql server 交集,差集的用法详解

    UNION集合运算可以将两个输入查询的结果组合成一个结果集。需要注意的是:如果一个行在任何一个输入集合中出现,它也会在UNION运算的结果中出现。T-SQL支持以下两种选项: (1)UNION ALL:不会删除重复行 -- union...

    YCY学习SQL

    8、 UNION 和 UNION ALL 操作符 13 9、 SELECT INTO语句 13 10、 CREATE DATABASE与CRESTE TABLE 15 11、 SQL 约束 16 12、 CREATE INDEX创建索引 25 13、 DROP语句集合 25 14、 AUTO INCREMENT字段 27 15、 视图...

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

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

    SQL数据查询——单表查询(二)

    SQL SERVER集合操作主要包括 并操作 UNION 交操作 INERSECT 差操作 EXCEPT 1.UNION 使用UNION能实现多个查询结果的合并,并形成一个完整的查询结果,系统会自动去掉重复的元组 #例:查询年龄不大于19岁的学生以及CS...

    精通SQL 结构化查询语言详解

    10.2.2 IN子查询实现集合交和集合差运算 10.2.3 EXISTS子查询  10.2.4 EXISTS子查询实现两表交集  10.2.5 SOME/ALL子查询  10.2.6 UNIQUE子查询  10.3 相关子查询  10.3.1 使用IN引入相关子查询  ...

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

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

    SQLServer2005考试题及答案

    4、在Transact-SQL语法中,SELECT语句的完整语法较复杂,但至少包括的部分(1___),使用关键字(2___)可以把重复行屏蔽,将多个查询结果返回一个结果集合的运算符是(3___),如果在SELECT语句中使用聚合函数时,...

    程序员的SQL金典.rar

     2.2.8 受限操作的变通解决方案 第3章 数据的增、删、改  3.1 数据的插入  3.1.1 简单的INSERT语句  3.1.2 简化的INSERT语句  3.1.3 非空约束对数据插入的影响  3.1.4 主键对数据插入的影响  3.1.5 外键对...

    经典全面的SQL语句大全

    随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现)  对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们可能太慢了些。你不能要求ASP“找个随机数”然后打印出来。实际上常见的解决...

Global site tag (gtag.js) - Google Analytics