加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQL CTE和ORDER BY影响结果集

发布时间:2020-12-12 07:47:20 所属栏目:MsSql教程 来源:网络整理
导读:我在下面粘贴了一个非常简化的SQL查询版本.我遇到的问题是ORDER BY语句正在影响我的CTE的选择结果.我无法理解为什么会这样,我最初的想法是在CTE中,我执行一些SELECT语句,然后ORDER BY应该对THOSE结果起作用. 不幸的是,我看到的行为是我的内部SELECT语句受到顺
我在下面粘贴了一个非常简化的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

任何人都可以解释为什么第一个查询只返回表中前10个的ID,第二个查询返回整个表的前10个(应用排序后).

解决方法

当您使用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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读