Sql server 行号()是否总是对外部结果排序?

Sql server 行号()是否总是对外部结果排序?,sql-server,common-table-expression,Sql Server,Common Table Expression,我使用CTE根据图书作者的销售排名对其进行排名。我知道行号()可以按照的顺序确定返回的行号 我的查询如下所示: WITH cte (idWork, author, rn) AS ( SELECT idWork, authorName, ROW_NUMBER() OVER (PARTITION BY idWork ORDER BY authorSalesRank) FROM dbo.Works_Authors_Works IN

我使用CTE根据图书作者的销售排名对其进行排名。我知道
行号()
可以按照
的顺序
确定返回的行号

我的查询如下所示:

WITH cte (idWork, author, rn)
AS
(
    SELECT
        idWork,
        authorName,
        ROW_NUMBER() OVER (PARTITION BY idWork ORDER BY authorSalesRank)
    FROM dbo.Works_Authors_Works
    INNER JOIN Authors ON Authors.idAuthor = Works_Authors_Works.idAuthor
)
SELECT TOP 100 * FROM cte 
我注意到结果如下所示,正如预期的那样:

+---------+----------------+------+
| idWork  | author         | rn   |
+---------+----------------+------+
| 1       | test1          | 1    |
| 1       | test2          | 2    |
| 1       | test3          | 3    |
| 2       | beep1          | 1    |
| 2       | beep2          | 2    |
| 3       | nobody         | 1    |
+---------+----------------+------+
我对这个CTE有两个问题:

  • 结果是否总是按
    行编号
    字段
    rn
    排序?例如,结果如何在
    idWork
    上分组,然后在
    rn
    上排序?例如,当
    idWork
    为1时,行按
    rn
    从1、2到3排序。这是巧合还是永远都是这样
  • 如果我从cte中选择TOP 1*,其中idWork=1,它是否总是返回
    rn
    =1的行
在执行计划中,它在
idWork
authorSalesRank
上有一个输入排序。这些是否意味着外部结果也按此排序


您应该明确订购

WITH cte (idWork, author, rn) AS (
    SELECT
        idWork,
        authorName,
        ROW_NUMBER() OVER (PARTITION BY idWork ORDER BY authorSalesRank) AS rn
    FROM dbo.Works_Authors_Works
    INNER JOIN Authors ON Authors.idAuthor = Works_Authors_Works.idAuthor
)
SELECT TOP 100 *
FROM cte
order by idWork, rn

SQL(所有数据库)不保证顺序如果没有指定顺序,即使它看起来“总是有效”,你也不应该依赖那些轶事证据。

如果没有CTE中select上的order by,结果可能会以不确定的顺序返回。如果你有其他行号()(order by AU Number desc)那么我们不能保证哪个订单在前面。在执行计划中,“已订购”将不真实我已附上执行计划,看起来它确实在管道中的某个点得到订购,因此可以分配行号。但是,如果让我们假设,将CTE的select连接到另一个表,并在select中首先列出它的数据,那么顺序可能会与您现在看到的有所不同。对于相关的select,如果没有ORDER By,则永远不能保证ORDER。很好的一点:在没有ORDER By…的情况下,永远不能保证ORDER,但它通常是按作用中的索引排序的,这些索引可能随查询计划而变化。@Clay是的,例如,当数据库返回缓存结果时,情况可能会发生变化,可以按任意顺序缓存/返回以提高性能