2016-04-22 25 views
2

獲取單個SQL表,我希望在執行此操作時查詢和更新前5行。以下不工作(因此這個問題),但可以解釋它是什麼,我想:更新表併爲select語句的頂部行設置

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

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

注:TOP沒有使用ORDER BY子句將選擇5 任意指定的記錄。

編輯:要獲取的記錄進行更新,你可以使用OUTPUT子句Name值,如由@C評論已經指出。白:

;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

對於這個例子: ; WITH更新所使用AS( SELECT TOP 5未決 FROM TempStaging WHERE未決= '優秀' ) UPDATE 更新所 SET 未決= '正在運行' OUTPUT inserted.pending ,插入.name –

0

試試這個

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

的最直接方式是使用UPDATEWHERE子句選擇值...嵌入一個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