2011-10-28 3 views
0

と仮定「の」によって決定される特定の順序でアップデート:私が欲しいものトン-SQL:式

declare @counter int 
set @counter = 0 

update MyTable 
set @counter = MyField = @counter + 1 
where Some_ID in (select ID from SomeTable) 

select ID from SomeTable IDが返されるように、その更新が同じ順序で起こっています。これを行うには良い方法がありますか?

+5

どうしてですか?セット操作では、順序は重要ではありません。 –

+2

これは、CTEとROW_NUMBERを1つのステートメントで使用して実行できます。 –

+1

@AustinSalonenそれはちょうど 'Select ID from SomeTable'がパラメータとして私に変わってきます。特定の順序で変更することはできず、その注文情報を格納する' MyField'が必要です – ren

答えて

5

ROW_NUMBERとCTEを使用してソリューションです...あなたはROW_NUMBEROVER句で返さSomeTableからレコードをしたいという順序を決定します。

;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 
2

更新されたレコードにインクリメントする数値を含む列を作成したいと思う場合は、IDのリストを取得していくつかの更新を行うだけです。

SQLサーバーでは、カーソルを使用してこれを行う可能性があります。ここで

DECLARE @id int, @counter int 
SET @counter = 0 
DECLARE ids CURSOR 
    FOR SELECT ID FROM SomeTable 

OPEN ids 
FETCH NEXT FROM ids INTO @id 

WHILE @@FETCH_STATUS == 0 
BEGIN 
    UPDATE MyTable SET MyField = @counter WHERE Some_ID = @id 
    SET @counter = @counter + 1 
    FETCH NEXT FROM ids INTO @id 
END 

CLOSE ids 
DEALLOCATE ids 
+1

yeap、しかし私は宣言的な方法があることを願っています – ren