对union集合操作理解不足造成的巨大的灾难

简介:

朋友和我说发现了oracle union操作的一个bug,他的查询语句如下:
SQL> select sum(a1) a1,sum(a2) a2
  2  from (
  3  select 1 a1,0 a2 from dual
  4  union
  5  select 0 a2, 1 a1 from dual
  6  )
  7  ;

        A1         A2
---------- ----------
         1          1


SQL> select 1 a1,0 a2 from dual
  2  union
  3  select 0 a2, 1 a1 from dual
  4  ;

        A1         A2
---------- ----------
         0          1
         1          0

说结果出错了,应该a2为0,他说别名为 a2的值其实是0,说union不是按别名来进行区别的,一开始我还没反应过来。后面想了一下,union的意思是用来合并两条查询的结果并去重,在oracle关于sql的文档中是说union集合操作中的两个查询中的列的类型和个数要相同。例如将上面两个查询别名为a2的值从0改成'0'再执行union操作就会报错:
SQL> select 1 a1,'0' a2 from dual
  2  union
  3  select '0' a2, 1 a1 from dual
  4  ;

select 1 a1,'0' a2 from dual
union
select '0' a2, 1 a1 from dual

ORA-01790: 表达式必须具有与对应表达式相同的数据类型

而从说明了union其实是按列出现的顺序进行合并的,并不是按别名.对union的意思理解不对危害很大,从上面的列来说他本来的意思是a2应该为0,但因为他的顺序写错了结果变成了1。这种危害太大了,如果这些数字是钱本来应该为0的,结果因为查询中列的顺序写错了,就会造成巨大的损失。 

目录
相关文章
|
SQL 索引 数据库
使用instr 函数优化替换Like条件子句提高数据检索性能案例总结
使用instr 函数优化替换Like条件子句提高数据检索性能
1166 0
使用instr 函数优化替换Like条件子句提高数据检索性能案例总结
|
索引 数据库
SqlServer中的UNION操作符在合并数据时去重的原理以及UNION运算符查询结果默认排序的问题
原文:SqlServer中的UNION操作符在合并数据时去重的原理以及UNION运算符查询结果默认排序的问题   本文出处:http://www.cnblogs.com/wy123/p/7884986.
2299 0
|
SQL 关系型数据库 MySQL
索引合并Intersection、union (3)--单表访问方法(三十八)
索引合并Intersection、union (3)--单表访问方法(三十八)
|
关系型数据库 MySQL 数据库
数据库并集union、交集intersect、差集except
数据库并集union、交集intersect、差集except 6
352 0
数据库并集union、交集intersect、差集except
|
Java 开发工具 Android开发
分析重复元素消除|学习笔记
快速学习 分析重复元素消除
109 0
|
Oracle 关系型数据库 索引
Oracle优化之表连接方式
Oracle优化之表连接方式在Oracle数据库中,两个表之间的表连接方法有排序合并连接、嵌套循环连接、哈希连接和笛卡尔连接四种 1.排序合并连接(sort merge join)   排序合并连接是一种两表在做表连接时用排序(SORT)操作和合并(MERGE)操作来得到连接结果集的表连接方法  ...
1360 0
|
SQL
SQL 操作结果集 -并集、差集、交集、结果集排序
原文:SQL 操作结果集 -并集、差集、交集、结果集排序 操作结果集   为了配合测试,特地建了两个表,并且添加了一些测试数据,其中重复记录为东吴的人物。   表:Person_1魏国人物       表:Person_2蜀国人物      A、Union形成并集     Union可以对两个或多个结果集进行连接,形成“并集”。
2529 0