从select语句更新表和顶部行的集

时间:2016-04-22 13:55:47

标签: sql-server

有一个SQL表,我想查询并更新前5行。以下不起作用(因此问题)但可能解释我正在尝试的是什么:

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

3 个答案:

答案 0 :(得分:4)

您可以使用CTEUPDATE

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

注意: TOP在没有ORDER BY子句的情况下使用会选择5个任意指定的记录。

修改:要获取正在更新的记录的Name值,您可以使用OUTPUT子句,如@C评论中所述。白:

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

答案 1 :(得分:1)

最直接的方法是使用UPDATE的{​​{1}}子句来选择值...嵌入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

希望有所帮助!

答案 2 :(得分:0)

试试这个

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