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