TOP/ORDER BY 順序(轉)


問題重現:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM