t-sql:按'in'表达式确定的特定顺序更新

ren*_*ren 0 sql t-sql sql-server sql-server-2008

假设:

declare @counter int
set @counter = 0

update MyTable
set @counter = MyField = @counter + 1
where Some_ID in (select ID from SomeTable)
Run Code Online (Sandbox Code Playgroud)

我想要的是更新发生的顺序与select ID from SomeTable返回ID 相同.有一个很好的方法来做到这一点?

Mic*_*son 5

这是一个使用CTE的解决方案ROW_NUMBER......你可以确定你希望SomeTableOVER子句中返回记录的顺序ROW_NUMBER.

;WITH rn (ID, rowNumber) AS
(
    SELECT st.ID, ROW_NUMBER() OVER (ORDER BY st.ID)
    FROM SomeTable st
    WHERE EXISTS (
        SELECT 1
        FROM MyTable mt
        WHERE mt.Some_ID = st.ID
    )   
)
UPDATE mt
SET MyField = rowNumber
FROM 
    MyTable mt 
    JOIN rn ON rn.ID = mt.Some_ID
Run Code Online (Sandbox Code Playgroud)