8

我在下面粘贴了一个非常简化的 SQL 查询版本。我遇到的问题是该ORDER BY语句正在影响我的 CTE 的选择结果。我一直无法理解为什么会这样,我最初的想法是在 CTE 中,我执行一些SELECT语句,然后ORDER BY应该对这些结果起作用。

不幸的是,我看到的行为是我的内心SELECT陈述受到 order by 的影响,给了我不在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(在应用排序之后)。

4

2 回答 2

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
于 2010-10-13T14:49:06.550 回答
5

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

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

然后是您的所有列..这将帮助您使用 CTE 锚点进行查询...使用 between、where 等子句..

于 2013-08-19T06:49:59.100 回答