用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。