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