我在下面粘贴了一个非常简化的SQL查询版本。我遇到的问题是该ORDER BY语句正在影响CTE的选择结果。我一直无法理解为什么会这样,我最初的想法是在CTE内执行一些SELECT声明,然后ORDERBY应该对THOSE结果起作用。
ORDER BY
SELECT
ORDERBY
不幸的是,我看到的行为是我的内部SELECT声明受到顺序的影响,从而给了我不在其中的“项” TOP 10。
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个ID(在应用排序之后)。
使用时SELECT TOP n,如果要确定性行为,则 必须 提供ORDER BY,否则服务器可以自由返回 任何感觉像的10行 。您看到的行为是完全有效的。
SELECT TOP n
要解决该问题,请在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