首页 > Web开发 > 详细

TOP/ORDER BY 顺序(转)

时间:2014-01-14 19:18:23      阅读:878      评论:0      收藏:0      [点我收藏+]

问题重现:

bubuko.com,布布扣
--建表语句,测试数据 
create table TestTable(Id int, Name nvarchar(20),CreateTime datetime) 
go 
declare @Count int = 1 
while(@Count<1000) 
begin 
    insert into TestTable 
        select @Count,Name +CAST(@Count as nvarchar(10)),DATEADD(day,@Count,GETDATE()) 
    set @Count = @Count+1; 
end 
go 
--建索引 
create clustered index IX_TestTable_CreateTime on TestTable(CreateTime) 
go 
--测试语句 
with c as( 
    select top 100 * from TestTable 
) 
select * from c order by CreateTime desc

语句分析:

按照字面意思,我们需要先从TestTable上取前100条数据,再把这100条数据按时间倒序显示。可实际结果却是先按CreateTime倒序,然后取后100条数据。也就是说,我们需要的结果是100~1,但是实际结果却是999~900。

执行计划如下:

bubuko.com,布布扣

原因分析:

其实原因很简单,在Inside Microsoft SQL Server 2005 T-SQL Querying书的第一节已经介绍过了,如下图:

bubuko.com,布布扣

可以看到。TOP在SQL 查询中,处在第11位,Order By处在第10位,所以Order by会比Top先执行。这就是为什么上面的语句没有按照我们的意思执行的原因了。 

解决方法:

with c as( 
    select top 100 * from TestTable 
) 
select * from c 
join TestTable as b on c.Id = b.Id 
order by b.CreateTime desc
bubuko.com,布布扣

如需转载,请注明本文原创自灰太狼的博客:http://blog.csdn.net/tjvictor

TOP/ORDER BY 顺序(转)

原文:http://www.cnblogs.com/shenyixin/p/3512008.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!