对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的,结果因为查询中列的顺序写错了,就会造成巨大的损失。 

目录
相关文章
|
6月前
|
存储 开发框架 .NET
C#数据去重的5种方式,你知道几种?
今天我们一起来讨论一下关于C#数据去重的的5种方式,每种方法都有其特点和适用场景,我们根据具体需求选择最合适的方式。当然欢迎你在评论区留下你觉得更好的C#数据去重的方式。
|
6月前
|
开发框架 .NET C#
C#数据去重的这几种方式,你知道几种?
C#数据去重的这几种方式,你知道几种?
|
SQL 索引 数据库
使用instr 函数优化替换Like条件子句提高数据检索性能案例总结
使用instr 函数优化替换Like条件子句提高数据检索性能
1140 0
使用instr 函数优化替换Like条件子句提高数据检索性能案例总结
|
5月前
|
存储 数据库
Union All:数据库查询的得力助手
Union All:数据库查询的得力助手
|
数据采集 关系型数据库 MySQL
软件测试|MySQL DISTINCT关键字过滤重复数据
软件测试|MySQL DISTINCT关键字过滤重复数据
68 0
软件测试|MySQL DISTINCT关键字过滤重复数据
|
SQL 关系型数据库 MySQL
sql处理重复的列,更好理清分组和分区
sql处理重复的列,更好理清分组和分区
84 0
|
索引 数据库
SqlServer中的UNION操作符在合并数据时去重的原理以及UNION运算符查询结果默认排序的问题
原文:SqlServer中的UNION操作符在合并数据时去重的原理以及UNION运算符查询结果默认排序的问题   本文出处:http://www.cnblogs.com/wy123/p/7884986.
2261 0
|
SQL 关系型数据库 MySQL
索引合并Intersection、union (3)--单表访问方法(三十八)
索引合并Intersection、union (3)--单表访问方法(三十八)
|
.NET 开发框架
linq Distinct 去除重复数据
转载:http://www.cnblogs.com/ldp615/archive/2011/08/01/distinct-entension.html 只可惜linq默认不支持.Distinct(p => p.ID); 试想如果能写成下面的样子,是不是更简单优雅: var p1 = products.Distinct(p => p.ID); var p2 = products.Distinct(p => p.Name);  使用一个简单的 lambda 作为参数,也符合 Linq 一贯的风格。
1352 0