union all的執行順序
IQ下面做應用開發的時候,遇到一個好玩的事情:
www.2cto.com
情況1中,發現一個規律,union all 中執行順序是:
以第一個union all 的select 語句(如 紅色標記)為分界線。
先從最後union all的select(如藍色標記)開始倒序輸出到 紅色標記的select子句,
再輸出第一個select子句
最後輸出紅色標記的select子句
Java代碼
select '1' AREA_NAME
union all
[color=red]select '3' AREA_NAME [/color]
union all
select distinct '2'AREA_NAME
from DW.AREA
where (area_type_id =2 and up_area_code = '00' ) or up_area_code = '-1'
union all
[color=blue]select '4' AREA_NAME[/color]
結果如下:
Java代碼
AREA_NAME
4
2
1
3
Java代碼
select '1' AREA_NAME
union all
select distinct '2'AREA_NAME
from DW.AREA
where (area_type_id =2 and up_area_code = '00' ) or up_area_code = '-1'
union all
select '3' AREA_NAME
union all
select '4' AREA_NAME
結果如下:
Java代碼
AREA_NAME
4
3
1
2
Java代碼
select '1' AREA_NAME
union all
select distinct '2'AREA_NAME
from DW.AREA
where (area_type_id =2 and up_area_code = '00' ) or up_area_code = '-1'
union all
select '3' AREA_NAME
union all
select '4' AREA_NAME
union all
select distinct '5' AREA_NAME
from DW.AREA
where (area_type_id =2 and up_area_code = '00' ) or up_area_code = '-1'
Java代碼
AREA_NAME
5
4
3
1
2
這裡面表DW.AREA為真實表。
情況2,如果下面這種情況下:
Java代碼
select '1' AREA_NAME
union all
select '2' AREA_NAME
union all
select '3' AREA_NAME
union all
select '4' AREA_NAME
Java代碼
AREA_NAME
'1'
'4'
'3'
'2'
Java代碼
select '2' AREA_NAME
union all
select '1' AREA_NAME
union all
select '4' AREA_NAME
union all
select '3' AREA_NAME
Java代碼
AREA_NAME
'2'
'3'
'4'
'1'
如union all的表不存在的時候,即單純select子句,輸出順序就變成了:
1.第一select 輸出。
2.此後從最後一個select倒序輸出。
上述為我目前看到的現象。
具體什麼原因,等後面有時間了的話,會好好探究的。
估計和cursor生成的信息有關。mark 一下。