我在下面粘贴了一个非常简化的SQL查询版本.我遇到的问题是ORDER BY语句正在影响我的CTE的选择结果.我无法理解为什么会这样,我最初的想法是在CTE中,我执行一些SELECT语句,然后ORDER BY应该对THOSE结果起作用.
不幸的是,我看到的行为是我的内部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
解决方法
当您使用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