2013-05-30 4 views
8

テーブルの列を更新して、値1〜(レコード数で決まる最大値)を使用しようとしています。テーブルの列をスケーリング値に更新する方法

私はこの権利を説明しているのかどうか分かりませんので、私は更新しようとしているデータでSQLFiddleを設定します。

SQL FIDDLE

私は(最大数)を介して1にバージョン列を設定します。 このクエリをバージョン番号のスケールに書き換える方法はありますか? ようで、私は私が言うことができるものから、最初の1を使用するため、レコード、2を使用する2番目のレコードのように...

UPDATE Documents 
SET Version = 1 
+1

希望の結果を投稿することはできますか?私はまだあなたが望むものを手に入れません – Lamak

答えて

4

は加入:

with RankedDocument as 
(
    select * 
    , rn = row_number() over (order by ID) 
    from Documents 
) 
update RankedDocument 
set Version = rn 

SQL Fiddle with demoを。

+0

これはleoinfoが投稿したバージョンよりも理解しやすいようです。また、結合が含まれていないため、より効率的であるように見えます。 – Zack

3

をしたい、あなたはDocumentsからすべてのレコードがversion数を持つようにしたいですこれはあなたがそれが戻ってあなたの元のテーブルへの増分versionを取得するには、一時テーブルとROW_NUMBER技術を使用して、UPDATE可能性が1から移動回数..... N.

です。

CREATE TABLE #Temp (ID int, Version int) 

INSERT INTO #Temp (ID, Version) 
SELECT ID, ROW_NUMBER() OVER (ORDER BY ID ASC) 
FROM Documents 

UPDATE Doc 
SET Version = TT.Version 
FROM Documents AS Doc INNER JOIN #Temp AS TT ON Doc.ID = TT.ID 

DROP TABLE #Temp 

私が正しくあなたを理解していれば...

1

はこれを試してみてください:

;WITH list AS (
    SELECT 
     ID 
    , Version = ROW_NUMBER() OVER(ORDER BY VersionID ASC) 
    FROM Documents 
) 
UPDATE d SET 
    d.Version = x.Version 
FROM Documents AS d 
INNER JOIN list as x ON d.ID=x.ID 

SELECT * FROM Documents 

あなたが必要とするものにオーダー(VERSIONIDのASC BY ORDER) を変更することができます。あなたはCTEなしでそれを行うことができます

+0

私はあなたのバージョンを使用しました。私は実際には昨年の10月からSQLで作業していましたが、ROW_NUMBER()について聞いたことがないので、使い方を教えてくれてありがとう! http://sqlfiddle.com/#!3/a09ed/48 – Zack

+0

このクエリの*冒頭にセミコロンがある理由はありますか? – Zack

+2

これは、問題を避けるために構築したばかりの習慣です。:)あなたのコードにWITHの前にあるものによっては、上記のステートメントでWITHを引数/オプションとして受け入れると、コードが失敗することがあります。たとえば、「BEGIN TRANSACTION WITH MARK」を参照してください。 – leoinfo

関連する問題