【问题标题】:Update Top 1 record in table sql server [duplicate]更新表 sql server 中的前 1 条记录 [重复]
【发布时间】:2013-12-30 14:29:52
【问题描述】:

我的查询

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 表中的 serial_No 列我有 10 条记录,但我想将最新的 TIMESTAMP2 更新为当前日期时间。

上面的查询抛出错误:

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

【问题讨论】:

  • 虽然问题是 SQL-SERVER,但对于谁搜索 MySql 解决方案,有一种更简单快捷的方法UPDATE TX_Master_PCBA SET TIMESTAMP2=NOW() WHERE SERIAL_NO='050030309' ORDER BY TIMESTAMP DESC LIMIT 1
  • @TomerW - 救生员,谢谢。没想到做极限!节省了我的时间,ty

标签: sql-server sql-server-2008


【解决方案1】:
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'

【讨论】:

  • 工作正常!谢谢你
【解决方案2】:

Kapil 接受的答案是有缺陷的,如果有 2 条或多条具有相同时间戳的记录可用,它会更新多条记录,而不是真正的 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

参考 Remus Rusanu 回答:- SQL update top1 row query

【讨论】:

  • 如果我想在这里使用 Join 并从该表中设置值怎么办?
【解决方案3】:
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
)

【讨论】:

    【解决方案4】:

    TOPINSERTUPDATEMERGEDELETE 一起使用时,引用的行不按任何顺序排列,并且不能在这些语句中直接指定 ORDER BY 子句。如果您需要使用 TOP 以有意义的时间顺序插入、删除或修改行,则必须将 TOP 与子选择语句中指定的 ORDER BY 子句一起使用。

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

    TOP 不能与OFFSETFETCH 在同一查询表达式中(在同一查询范围内)组合使用。欲了解更多信息,请参阅http://technet.microsoft.com/en-us/library/ms189463.aspx

    【讨论】:

      【解决方案5】:

      对于那些正在寻找线程安全解决方案的人,请查看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 
      )
      

      【讨论】:

      • +1 用于线程安全,尽管当AccountId 不是唯一的时,您将不得不在stackoverflow.com/a/32395239/4496560 提到的cte 中工作,以仅获取一条记录。
      • 我发现这个 SP 更新了所有记录,所以我把顶行看起来像这个 UPDATE Account Top (1)
      【解决方案6】:

      它也很好用......

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多