迟到的TOP
来源:互联网 发布:威尔取模软件 编辑:程序博客网 时间:2024/04/30 19:36
问题重现:
--建表语句,测试数据
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
- 迟到的Top语句
- 迟到的TOP
- 迟到的纪念
- 迟到的游记
- 迟到的纪念。
- 迟到的累
- 迟到的生日礼物
- “迟到”的linux
- 迟到的生日祝福
- 迟到的第一篇
- 迟到的思考
- 迟到的点名
- 迟到的爱
- 迟到的机遇
- 迟到的祝福
- 迟到的SqlCommand异步
- 迟到的理由
- 迟到的雪
- java反射与CGLIB代理的一个细节。
- 《C现代方法》第二章:C语言基本概念 (2)
- 数据库设计三大范式应用实例剖析
- 郁闷的心情
- 传数组名的小问题
- 迟到的TOP
- OOA/OOD/OOP
- 智力题
- 搭建Android开发环境
- 循环例子-for高级应用
- 处事22计、心态决定你的人生(每天必读)、伤心时要读的50句话和人的基本礼仪(保证你能学到不少东西)
- ASP中有关双引号,单引号以及&号的解释
- android框架
- 函数实例-简单的函数