Обновить первую 1 запись в таблице SQL Server [дубликат]

На этот вопрос уже есть ответ:

Мой запрос

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

со столбцом serial_No в таблице TX_Master_PCBA У меня есть 10 записей, но я хочу обновить самую последнюю TIMESTAMP2 до текущей даты-времени.

Приведенный выше запрос выдает ошибку:

Неверный синтаксис рядом с ключевым словом «TOP».

30
задан 17.05.2020, 17:13

6 ответов

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
)
23
ответ дан 17.05.2020, 17:14
  • 1
    @gakera Это не работает под ISE Powershell. – Artemix 02.05.2020, 00:49
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'
38
ответ дан 17.05.2020, 17:14
  • 1
    Я получаю ошибку: Exception calling "ReadKey" with "1" argument(s): "The method or operation is not implemented." At C:\file.ps1:26 char:5 + $null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown'); + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : NotImplementedException – gakera 02.05.2020, 00:49

Принятый ответ 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

Ref Remus Rusanu Ans: - SQL-запрос top1 строки запроса

16
ответ дан 17.05.2020, 17:15
  • 1
    Проверьте ответ от (Jerry G) для того, как закрепить на ISE. Эти проблемы - то, что привело меня к этому вопросу – ZaxLofful 02.05.2020, 00:49

Для тех, кто ищет поточно-ориентированное решение, посмотрите здесь .

Код:

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 
)
4
ответ дан 17.05.2020, 17:15

Когда TOP используется с INSERT, UPDATE, MERGE или DELETE, ссылочные строки не располагаются ни в каком порядке, и предложение ORDER BY не может быть непосредственно указано в этих операторах. Если вам нужно использовать TOP для вставки, удаления или изменения строк в значимом хронологическом порядке, вы должны использовать TOP вместе с предложением ORDER BY, которое указано в операторе subselect.

TOP нельзя использовать в выражениях UPDATE и DELETE для разделенных представлений.

TOP нельзя объединить с OFFSET и FETCH в одном и том же выражении запроса (в одной и той же области запроса). Для получения дополнительной информации см. http://technet.microsoft.com/en-us/library/ms189463.aspx

.
12
ответ дан 17.05.2020, 17:16

Это также хорошо работает ...

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
4
ответ дан 17.05.2020, 17:17
  • 1
    Это только работает в powershell.exe - это won' t работают над графическими хостами как ISE. – Jason Shirk 02.05.2020, 00:50

Теги

Похожие вопросы