Sql server 更新sql server表中的前1条记录
我的问题Sql server 更新sql server表中的前1条记录,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我的问题 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\u Master\u PCBA表中的serial\u No列,我有10条记录,但我想将最新的TIMESTAMP2更新为当前日期时间 上述查询正在抛出错误: 关键字“TOP”附近的语法不正确 当TOP与INS
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\u Master\u PCBA
表中的serial\u No
列,我有10条记录,但我想将最新的TIMESTAMP2
更新为当前日期时间
上述查询正在抛出错误:
关键字“TOP”附近的语法不正确
当
TOP
与INSERT
、UPDATE
、MERGE
或DELETE
一起使用时,引用的行不会按任何顺序排列,并且不能在这些语句中直接指定order BY子句。如果需要使用TOP按有意义的时间顺序插入、删除或修改行,则必须将TOP
与subselect语句中指定的order BY
子句一起使用
TOP
不能用于分区视图上的UPDATE
和DELETE
语句
TOP
不能与同一查询表达式(在同一查询范围内)中的OFFSET
和FETCH
组合。有关更多信息,请参见Kapil的公认答案有缺陷,如果有2条或多条记录具有相同的时间戳,它将更新多条记录,而不是真正的前1条查询
;With cte as (
SELECT TOP(1) email_fk FROM abc WHERE id= 177 ORDER BY created DESC
)
UPDATE cte SET email_fk = 10
参考Remus Rusanu Ans:-对于那些正在寻找线程安全解决方案的人,请看一看 代码: 它也很有效
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
虽然问题是SQL-SERVER,但对于谁搜索MySql解决方案,有一种更简单更快的方法
更新TX_Master_PCBA SET TIMESTAMP 2=NOW(),其中SERIAL_NO='05030309'按时间戳排序DESC LIMIT 1
@TomerW-life saver,谢谢。甚至都没想过做个极限!节省了我的时间,TY如果我想在此处使用Join并从该表中设置值,该怎么办?+1用于线程安全,尽管当AccountId
不唯一时,您将不得不在中提到的cte中工作,以仅获取一条记录。我发现此SP更新了所有记录,因此我将顶行设置为此更新帐户顶部(1)干得好!非常感谢。
;With cte as (
SELECT TOP(1) email_fk FROM abc WHERE id= 177 ORDER BY created DESC
)
UPDATE cte SET email_fk = 10
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
)
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