有没有办法替换 Rank() OVER SQL 中的 TOP 100 PERCENT?

Bri*_*den 1 t-sql sql-server

所以这个 SQL 对相册中的页面进行排序,在添加新上传的页面后调用它,它更新序列顺序:

UPDATE Gallery.AlbumAsset
SET
    Sequence = X.Rank
FROM Gallery.AlbumAsset albass
INNER JOIN 
(
    SELECT TOP 100 PERCENT
        Rank() OVER (Order By Sequence, AssetId) As Rank, AssetId
    FROM Gallery.AlbumAsset
    WHERE AlbumId = @AlbumId and Sequence > 0
    ORDER BY Rank

) X ON albass.AssetId = X.AssetId AND albass.Sequence != X.Rank
WHERE albass.AlbumId = @AlbumId
Run Code Online (Sandbox Code Playgroud)

我认为 TOP 100 PERCENT 令人困惑,并且对于可读性来说不是最佳的,所以我尝试进行更改:

UPDATE Gallery.AlbumAsset
SET
    Sequence = X.Rank
FROM Gallery.AlbumAsset albass
INNER JOIN 
(
    SELECT
        Rank() OVER (Order By Sequence, AssetId) As Rank, AssetId
    FROM Gallery.AlbumAsset
    WHERE AlbumId = @AlbumId and Sequence > 0
    ORDER BY Rank

) X ON albass.AssetId = X.AssetId AND albass.Sequence != X.Rank
WHERE albass.AlbumId = @AlbumId
Run Code Online (Sandbox Code Playgroud)

这会导致错误:

ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效,除非还指定了 TOP、OFFSET 或 FOR XML。

也许我只是需要使用,TOP但我试图稍微简化这个 SQL,但自从我使用“更复杂”的 SQL 语句以来已经有一段时间了,我几乎尝试以某种方式使用 CROSS APPLY,但我认为这是一个不正确的选择方向。

Nat*_*ths 5

您可以从子查询中删除 TOP 和 ORDER BY 子句 - 因为这是一个子查询,ORDER BY 子句没有任何作用,我怀疑 TOP 子句只是为了防止您在子查询中使用 ORDER by 时看到的错误。