问题重现:
--建表语句,测试数据 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。
执行计划如下:
原因分析:
其实原因很简单,在Inside Microsoft SQL Server 2005 T-SQL Querying书的第一节已经介绍过了,如下图:
可以看到。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
如需转载,请注明本文原创自灰太狼的博客:http://blog.csdn.net/tjvictor