Union 中使用Order by

用Union All 合併多個表時,如果要每個表都按表內某個字段排序,然後再合併成一個表(順序不變),在UNION ALL 的每個段內可以用子查詢,然後在子查詢內運用TOP與ORDER BY,但是在實踐的過程中,發現了一個奇怪的地方。

有以下兩表

#t1:

序號           

--------------

1981
608
3448
4150
7114

 

#t2:

序號

--------------

8046
5288
3955
3956
4987

要達到的效果:

序號

---------------------

608
1981
3448
4150
7114

3955
3956
4987
5288
8046

說明:前五行是#t1的,後五行是#t2的,每個子表內的行都是按“序號”進行排序

當SQL語句如下所寫時:

select * from
(
select top 100 percent  *  From #t1 order by 序號
) a
union all
select * From
(
select top 100 percent  *  From #t2 order by 序號
) a

 

結果是:

序號

---------------------------

1981
608
3448
4150
7114
8046
5288
3955
3956
4987

 

可以看到,並不是要求的結果。

但是如果SQL語句的寫法是:

select * from
(
select top 99.99999 percent  *  From #t1 order by Prodid
) a
union all
select * From
(
select top 99.99999 percent  *  From #t2 order by Prodid
) a

 

結果達到了預期。

 

這兩段語句的差別就只在於top後面的百分數。難道是100時,SQLSERVER不管三七二十一就把全部數據取出來了,也不排序什麼的?呵呵,還未找到答案。

用的SQL SERVER是2005。

發佈了15 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章