更新 SQL Server 表中的 Top 1 记录

56

我的查询

UPDATE TOP (1) TX_Master_PCBA  
SET TIMESTAMP2 = '2013-12-12 15:40:31.593'
WHERE SERIAL_NO IN ('0500030309') 
ORDER BY TIMESTAMP2 DESC 

TX_Master_PCBA表中,我有10个记录,但我想将最新的TIMESTAMP2更新为当前日期时间。

上述查询会出现以下错误:

关键字'TOP'附近的语法不正确。


2
虽然问题中提到了SQL-SERVER,但对于寻找MySql解决方案的人来说,有一种更简单、更快速的方法:UPDATE TX_Master_PCBA SET TIMESTAMP2=NOW() WHERE SERIAL_NO='050030309' ORDER BY TIMESTAMP DESC LIMIT 1 - Tomer W
1
@TomerW - 救星,谢谢。我甚至没有想到要设置限制!你为我节省了数小时的时间,感谢。 - James Osguthorpe
6个回答

66
WITH UpdateList_view AS (
  SELECT TOP 1  * from TX_Master_PCBA 
  WHERE SERIAL_NO IN ('0500030309') 
  ORDER BY TIMESTAMP2 DESC 
)

update UpdateList_view 
set TIMESTAMP2 = '2013-12-12 15:40:31.593'

工作正常!谢谢。 - sergioBertolazzo

31

Kapil的被接受的回答存在缺陷,如果存在多个时间戳相同的记录,它将更新多个记录而不是真正的Top 1查询。

    ;With cte as (
                    SELECT TOP(1) email_fk FROM abc WHERE id= 177 ORDER BY created DESC   
            )
    UPDATE cte SET email_fk = 10

Ref Remus Rusanu Ans:- SQL更新顶部1行查询


如果我想在这里使用Join并从那个表中设置值怎么办? - Renascent

25
UPDATE TX_Master_PCBA
SET TIMESTAMP2 = '2013-12-12 15:40:31.593',
G_FIELD='0000'
WHERE TIMESTAMP2 IN 
(
   SELECT TOP 1 TIMESTAMP2
   FROM TX_Master_PCBA WHERE SERIAL_NO='0500030309'
   ORDER BY TIMESTAMP2 DESC   -- You need to decide what column you want to sort on
)

13

寻找线程安全解决方案的人可以在这里查看

代码:

UPDATE Account 
SET    sg_status = 'A'
OUTPUT INSERTED.AccountId --You only need this if you want to return some column of the updated item
WHERE  AccountId = 
(
    SELECT TOP 1 AccountId 
    FROM Account WITH (UPDLOCK) --this is what makes the query thread safe!
    ORDER  BY CreationDate 
)

2
+1 线程安全,尽管当 AccountId 不唯一时,你需要像 https://dev59.com/5mIj5IYBdhLWcg3wMiUu#32395239 中提到的那样在 CTE 中工作,以仅获取单个记录。 - Gregor y
我发现这个存储过程更新了所有记录,所以我将顶部行修改为 UPDATE Account Top (1)。 - Zenacity

12

当在INSERTUPDATEMERGEDELETE语句中使用TOP关键字时,所引用的行没有任何排序,并且不能在这些语句中直接指定ORDER BY子句。如果您需要使用TOP按照有意义的时间顺序插入、删除或修改行,则必须将TOP与在子查询语句中指定的ORDER BY子句一起使用。

TOP不能在分区视图的UPDATEDELETE语句中使用。

TOP不能与OFFSETFETCH结合在同一个查询表达式(在同一个查询范围内)。有关更多信息,请参见http://technet.microsoft.com/en-us/library/ms189463.aspx


7

它也可以很好地处理一些复杂的 IT 技术问题。

Update t
Set t.TIMESTAMP2 = '2013-12-12 15:40:31.593'
From
(
    Select Top 1 TIMESTAMP2
    From TX_Master_PCBA
    Where SERIAL_NO IN ('0500030309')
    Order By TIMESTAMP2 DESC
) t

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接