--建表語句,測試數據
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