SQL CTE和ORDER BY影响结果集

时间:2010-10-13 14:47:19

标签: sql sql-server sql-server-2008 common-table-expression

我在下面粘贴了一个非常简化的SQL查询版本。我遇到的问题是ORDER BY语句正在影响我的CTE的选择结果。我无法理解为什么会这样,我最初的想法是,在CTE中,我执行了一些SELECT语句,然后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位(应用排序后)。

2 个答案:

答案 0 :(得分:14)

当您使用SELECT TOP n时,必须提供ORDER BY,如果您想要确定性行为,否则服务器可以自由返回任意10行,感觉就像。您看到的行为完全有效。

要解决此问题,请在CTE中指定ORDER BY:

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

答案 1 :(得分:3)

我认为您可以添加新列,例如

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

然后你的所有列..这将帮助你使用CTE锚点查询...使用between,where etc子句..