迟到的Top语句

问题重现:

--建表语句,测试数据
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

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值