2016-04-22 5 views
2

これを行う際に上位5行を照会して更新したい単一のSQLテーブルがあります。以下は動作しません(したがって、ご質問)それは私がしようとしていますが何であるかを説明するかもしれない:更新テーブルと選択ステートメントから一番上の行に設定

;WITH ToUpdate AS (
    SELECT TOP 5 pending 
    FROM TempStaging 
    WHERE pending = 'outstanding' 
) 
UPDATE 
    ToUpdate 
SET 
    pending = 'running' 

注:TOPなしで使用

UPDATE 
    TempStaging 
SET 
    pending = 'running' 
FROM 
    (SELECT TOP 5 scan FROM TempStaging 
     WHERE pending = 'outstanding') 
+0

UPDATEにはTOP句があり、 も存在します。重複記事 [SQL Serverのトップ100レコードを更新するにはどうすればいいですか?](http://stackoverflow.com/questions/1198364/how-can-i-update-top-100 -records-in-sql-server) – Alexey

+0

レコードを注文するためのキーがあるとします。 –

+0

クエリが間違っています。 'FROM'の後には、テーブル名を使うべきですが、SELECT文を使用しました。 –

答えて

4

あなたはCTEUPDATEにを使用することができますORDER BY節は、を任意に指定してレコードを選択します。

編集:すでに@Cによってコメントで述べたように、あなたが、OUTPUT句を使用することができ、更新されたレコードのName値を取得します。ホワイト:

;WITH ToUpdate AS (
    SELECT TOP 5 pending, name 
    FROM #TempStaging 
    WHERE pending = 'outstanding' 
) 
UPDATE ToUpdate 
SET pending = 'running' 
OUTPUT inserted.name 
+0

ありがとう - 2列の名前があり、これらの同じ上位5行に名前を出力するにはどうすればよいですか? – dross

+0

@dross *出力名*はどういう意味ですか?これは 'UPDATE'ステートメントです。この例で –

+1

: ; ToUpdate AS WITH UPDATE ToUpdate SET をinserted.pending OUTPUT 'を実行' =ペンディング、挿入( のSELECT TOP 5ペンディング= '未処理' TempStaging FROM ペンディング) .name –

0

最も簡単な方法は、値を選択するUPDATEWHERE句を使用することで、この

UPDATE Top(5) TempStaging SET pending = 'running' WHERE pending = 'outstanding' 
1

をお試しください... IN (SELECT TOP 5 ...)を埋め込みはそれを行う必要があります。

例:

create table ##dummy (pk int IDENTITY (1,1) PRIMARY KEY, vals varchar(50)); 
INSERT INTO ##dummy (vals) VALUES 
    ('updateme') 
    ,('updateme') 
    ,('updateme') 
    ,('updateme') 
    ,('updateme') 
    ,('leavemealone') 
    ,('leavemealone') 
    ,('leavemealone') 
    ,('leavemealone') 
    ,('leavemealone') 
    ,('leavemealone') 
    ,('leavemealone') 
    ,('leavemealone') 

SELECT * FROM ##dummy 
UPDATE ##dummy 
    SET vals = 'fixed!' 
WHERE 
    pk in (SELECT TOP 5 pk FROM ##dummy ORDER BY pk) 
SELECT * FROM ##dummy 

DROP TABLE ##dummy 

は、だからあなたの特定の例と、それはおそらくです:助け

UPDATE 
    TempStaging 
SET 
    pending = 'running' 
WHERE 
    scan IN (SELECT TOP 5 scan FROM TempStaging WHERE pending = 'outstanding' ORDER BY scan) 

願っています!

+0

オリジナルの質問で私は心を込めて、Giorgos Betsosの回答を明確にするために正しいとマークしました。 – dross

関連する問題