有没有办法从这个Rank()OVER SQL中取代TOP 100 PERCENT?

时间:2015-11-25 23:44:08

标签: sql-server tsql

因此,这个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

我认为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

导致错误:

  

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

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

1 个答案:

答案 0 :(得分:4)

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