2010-10-13 47 views
6

我在下面粘貼了一個非常簡化的SQL查詢語句。我遇到的問題是ORDER BY聲明影響了我的CTE的選擇結果。我一直無法理解爲什麼會這樣,我原先的想法是,在CTE內部,我執行一些SELECT聲明,然後ORDER BY應該處理這些結果。SQL CTE和ORDER BY影響結果集

不幸的是,我看到的行爲是我的內部SELECT聲明受到訂單的影響,給我的'物品'不在TOP 10

這裏是數據的例子: (由ID以相反的順序索引)

ID, Date 
9600 2010-10-12 
9599 2010-09-08 
9598 2010-08-31 
9597 2010-08-31 
9596 2010-08-30 
9595 2010-08-11 
9594 2010-08-06 
9593 2010-08-05 
9592 2010-08-02 
.... 
9573 2010-08-10 
.... 
8174 2010-08-05 
.... 
38 2029-12-20 

我的基本查詢:

;with results as(
select TOP 10 ID, Date 
from dbo.items 
) 
SELECT ID 
FROM results 

查詢返回:

ID, Date 
9600 2010-10-12 
9599 2010-09-08 
9598 2010-08-31 
9597 2010-08-31 
9596 2010-08-30 
9595 2010-08-11 
9594 2010-08-06 
9593 2010-08-05 
9592 2010-08-02 

我與ORDER BY

;with results as(
select TOP 10 ID, Date 
from dbo.items 
) 
SELECT ID 
FROM results 
ORDER BY Date DESC 

查詢查詢返回:

ID, Date 
38 2029-12-20 
9600 2010-10-12 
9599 2010-09-08 
9598 2010-08-31 
9597 2010-08-31 
9596 2010-08-30 
9595 2010-08-11 
9573 2010-08-10 
9594 2010-08-06 
8174 2010-08-05 

任何人都可以解釋爲什麼第一個查詢將只返回在表中的前10位ID和第二查詢返回整個表的前10(應用排序後)。

回答

10

當您使用SELECT TOP n必須,如果你想確定的行爲,否則服務器可以自由返回感覺任何10行提供一個ORDER BY。你所看到的行爲完全有效。

爲了解決這個問題,指定一個ORDER BY的CTE內:

WITH results AS 
(
    SELECT TOP 10 ID, Date 
    FROM dbo.items 
    ORDER BY ID DESC 
) 
SELECT ID 
FROM results 
ORDER BY Date 
+0

我想我想要它從表中返回前10行,然後排序前10行,不排序整個表,並choo從這套設備中排名前10位......我的誤解在哪裏? – Brett 2010-10-13 14:50:38

+2

@Brett - 您需要告訴數據庫「表中前10行」的含義。根據什麼指標排名前10位?也許按日期排序? – 2010-10-13 14:51:30

+0

那麼你是否說我需要在CTE內部下單?所以:';結果如下(SELECT TOP 10 ID,PostedDate From items ORDER BY ID desc)'?....我的困惑源於CTE之外的ORDER BY是否影響CTE結果? – Brett 2010-10-13 14:52:46

1

我認爲你可以像

SELECT ROW_NUMBER() OVER(ORDER BY <ColumnName>;) AS RowNo 

,然後所有列。這會幫助你增加新的列以查詢使用CTE錨點...使用之間,其中etc子句..

+0

這是正確的答案。 – hoanvd1210 2017-11-22 08:04:24