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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值