獲取單個SQL表,我希望在執行此操作時查詢和更新前5行。以下不工作(因此這個問題),但可以解釋它是什麼,我想:更新表併爲select語句的頂部行設置
UPDATE
TempStaging
SET
pending = 'running'
FROM
(SELECT TOP 5 scan FROM TempStaging
WHERE pending = 'outstanding')
獲取單個SQL表,我希望在執行此操作時查詢和更新前5行。以下不工作(因此這個問題),但可以解釋它是什麼,我想:更新表併爲select語句的頂部行設置
UPDATE
TempStaging
SET
pending = 'running'
FROM
(SELECT TOP 5 scan FROM TempStaging
WHERE pending = 'outstanding')
可以使用CTE
到UPDATE
:
;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
謝謝 - 如果有2列名稱和待定如何輸出這些相同的前5行的名稱? – dross
@dross你是指什麼意思*輸出名稱*?這是一個'UPDATE'語句。 –
對於這個例子: ; WITH更新所使用AS( SELECT TOP 5未決 FROM TempStaging WHERE未決= '優秀' ) UPDATE 更新所 SET 未決= '正在運行' OUTPUT inserted.pending ,插入.name –
試試這個
UPDATE Top(5) TempStaging SET pending = 'running' WHERE pending = 'outstanding'
的最直接方式是使用UPDATE
的WHERE
子句選擇值...嵌入一個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)
希望幫助!
考慮到我原先提出的問題,爲了清楚起見,我已將Giorgos Betsos答案標記爲正確。 – dross
UPDATE有TOP子句, 也存在重複的文章 [我如何更新sql server中的前100條記錄](http://stackoverflow.com/questions/1198364/how-can-i-update-top-100 -records-in-sql-server) – Alexey
假設你有某種你要訂購記錄的密鑰: –
你的查詢是錯誤的。在FROM之後,你應該使用一個表名,但是你使用了一個SELECT語句。 –