2013-08-25 21 views
14

既存のテーブルに新しい列を追加しようとしています。値は行番号/ランクです。行番号/ランク値を生成する方法が必要です。また、影響を受ける行を制限する必要があります。この場合、文字列内に部分文字列が存在することになります。SQL Server 2012で行番号列を追加する方法

今私が持っている:

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()関数? FYI、これは間違った、既存の「ランク」列を置き換えることを意味します。

+0

少なくとも、並べ替え、検索、更新を計画しているものはどれですか? – dcaswell

答えて

24

あなたは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 

SQL Fiddle with demo

+0

ありがとうございます、一度最初にrow_idを作成したらうまくいきました。 –

-1

簡単な回避策は、idはあなたのメインのテーブルの主キーと同じタイプである

を表#TEMP(ID int型、ランクint)をCREATE

のように見える一時テーブルを作成することです。

ちょうどあなたがわずか数千行を更新する場合は、あなたがこのような何かを試みることができる

1

...最初の一時テーブルを埋めた後、一時テーブルから更新するために、SELECT INTOを使用します。

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 

コピーし、クエリ結果をクエリエディタに貼り付けて実行します。それは少し遅くて、ゆっくりしたビットです。

関連する問題