行番号/ランクが値である既存のテーブルに新しい列を追加しようとしています。行番号/ランク値を生成する方法が必要です。また、影響を受ける行を制限する必要があります。この場合、文字列内の部分文字列の存在です。
今私は持っています:
_UPDATE table
SET row_id=ROW_NUMBER() OVER (ORDER BY col1 desc) FROM table
WHERE CHARINDEX('2009',col2) > 0
_
そして私はこのエラーを受け取ります:
_Windowed functions can only appear in the SELECT or ORDER BY clauses.
_
(RANK()
でも同じエラー)
ROW_NUMBER()関数で列を作成/更新する方法はありますか?ちなみに、これは、正しくない既存の「ランク」列を置き換えることを目的としています。
これは、次のようなCTEで実行できます。
with cte as
(
select *
, new_row_id=ROW_NUMBER() OVER (ORDER BY col1 desc)
from MyTable
where charindex('2009',col2) > 0
)
update cte
set row_id = new_row_id
数千行しか更新しない場合は、次のようなことを試すことができます。
select 'UPDATE MyTable SET ID = ' + CAST(RowID as varchar) + ' WHERE ID = ' + CAST(ID as varchar)
From (
select MyTable, ROW_NUMBER() OVER (ORDER BY SortColumn) RowID from RaceEntry
where SomeClause and SomeOtherClause
) tbl
クエリ結果をコピーしてクエリエディターに貼り付け、実行します。それはそれが機能する少し緩慢でゆるいビットです。