對union集合操作理解不足造成的巨大的災難

eric0435發表於2014-11-19

朋友和我說發現了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的,結果因為查詢中列的順序寫錯了,就會造成巨大的損失。 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26015009/viewspace-1339528/,如需轉載,請註明出處,否則將追究法律責任。

相關文章