当前位置: 首页 > 面试题库 >

SQL CTE和ORDER BY影响结果集

江志业
2023-03-14
问题内容

我在下面粘贴了一个非常简化的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个ID(在应用排序之后)。


问题答案:

使用时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


 类似资料:
  • 我对一个< code>select有一些奇怪的问题。< code>WHERE子句中的顺序可能会影响结果吗? 这是我的选择: 这将重现这个结果:http://dl.dropbox.com/u/4892450/sqlSelectProblem/select1.PNG 当我使用这个条件时: (不同的顺序) 我得到一个不同的结果(参见 列): http://dl.dropbox.com/u/4892450

  • vercel生产环境中的路由的post处理函数影响get处理函数的响应结果 本地开发环境是正常的,而且在本地进行build后,使用next start启动的环境也是正常的 但是如果我把这整个post都注释掉,再通过vercel部署,就正常了! 我整个应用都没有发起对应的post请求,无论是否注释掉 vercel的生产环境 本地开发环境 错误在于vercel部署的get请求没有返回对应的flag字段

  • 本文向大家介绍浅析lastIndex对正则表达式结果的影响,包括了浅析lastIndex对正则表达式结果的影响的使用技巧和注意事项,需要的朋友参考一下 前言   今天遇到一个问题,用正则表达式去检查同一个字符串时,交替返回true和false。无奈之下,重新翻了翻权威指南,发现罪魁祸首原来是lastIndex。可在控制台尝试下 lastIndex   lastIndex在权威指南中是如下解释:它是

  • 我已经开始编写一个类,用于在将对象写入和更新到数据库时进行权限检查。对于开发和测试,可以通过play配置值禁用权限检查。我的第一个做法是在启用权限检查的情况下编写测试。如果在测试运行时禁用了检查,我只需通过以下方式禁用测试 当然,这意味着在开发中,当权限检查被禁用时,测试可能永远不会运行。 在每个测试中有两个代码路径会更合适吗,一个用于启用配置,一个用于禁用配置? 此外,现在是引入模拟框架的时候了

  • HTTP状态码 返回的 HTTP 状态码大于等于200小于300表示成功;大于等于400小于500为客户端错误;大于500为服务端错误 HTTP状态码 描述 处理建议 200 请求处理成功 用户请求处理成功(但查询API有可能返回空结果,需要另行判断) 400 请求处理失败 用户发出的请求的参数或格式有错误 401 身份验证失败 检查请求Header中的X-Ca-Key是否正确,或合作服务是否到期

  • 我正在使用Spring Data JPA在我的spring boot项目。 我正在激发一个JPQL查询,并使用一个投影来存储查询的结果。我的投影: 我的服务调用此投影: 现在我想使用Mockito(单元测试用例)测试这个服务,我正在使用when和thenreturn模拟对存储库的调用。 我的问题是如何模拟存储库的结果?回信里应该有什么?我的意思是,我如何创建投影实例并将数据设置到它?