2013-12-12 88 views
19

我的查询表的SQL Server更新前1记录

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_PCBAserial_No专栏中,我有10条记录,但我想更新最新TIMESTAMP2当前日期时间。

上述查询抛出错误:关键字 'TOP' 近

不正确的语法。

+0

可能重复http://stackoverflow.com/questions/19584315/sql-update-top-with-order-by) – GolfWolf

+0

尽管问题陈述了SQL-SERVER,对于搜索MySql解决方案的用户来说,有一种更简单快捷的方法:UPDATE TX_Master_PCBA SET TIMESTAMP2 = NOW()WHERE SERIAL_NO ='050030309'ORDER BY TIMESTAMP DESC LIMIT 1' –

+0

[SQL update top1 row query](http:// stackov erlang.com/questions/3860975/sql-update-top1-row-query) – fabriciorissetto

回答

21
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 
) 
7

TOP使用具有INSERTUPDATEMERGE,或DELETE,所引用的行不设置在任何顺序和ORDER BY子句不能在这些语句直接指定。如果您需要使用TOP以有意义的时间顺序插入,删除或修改行,则必须使用TOP以及在subselect语句中指定的ORDER BY子句。

TOP不能用于分区视图上的UPDATEDELETE语句。 (在同一个查询范围内)不能与OFFSETFETCH组合使用。欲了解更多信息,请参阅http://technet.microsoft.com/en-us/library/ms189463.aspx

31
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' 
13

接受卡皮的答案是有缺陷的,如果有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 

参考莱姆斯Rusanu答: - SQL update top1 row query

+0

如果我想在此处使用Join并从该表中设置值, –

2

对于那些谁正在寻找一个线程安全的解决方案来看看here

代码:

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 
) 
3

这也是行之有效的...

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 UPDATE TOP与ORDER BY(的