所以这个 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,但我认为这是一个不正确的选择方向。
您可以从子查询中删除 TOP 和 ORDER BY 子句 - 因为这是一个子查询,ORDER BY 子句没有任何作用,我怀疑 TOP 子句只是为了防止您在子查询中使用 ORDER by 时看到的错误。