Обновите столбец с порядковым номером от 1 с помощью where и order by - PullRequest
0 голосов
/ 20 мая 2019

Я пытаюсь выполнить следующий запрос SQL, чтобы обновить столбец с именем seq с нумерацией для определенного идентификатора, но выдает ошибку:

Неверный синтаксис рядом с ключевым словом 'ЗАКАЗАТЬ'.

DECLARE @id INT 
SET @id = 0 

UPDATE T_TRNHIST 
SET @id = seq = @id + 1 
WHERE Acc='12344'
OPTION ( MAXDOP 1 )
ORDER BY Recid, trnDate

Где я мог ошибиться?

Ответы [ 2 ]

1 голос
/ 20 мая 2019

Вы не можете использовать order by в операторе обновления, и вы должны быть очень осторожны при использовании необычных обновлений, так как они очень непредсказуемы.

Простым, надежным решением было бы использование обновляемого общего табличного выражения с row_number:

WITH CTE AS
(
    SELECT  seq,
            ROW_NUMBER() OVER(ORDER BY Recid, trnDate) As rn
    FROM T_TRNHIST
)

UPDATE CTE 
SET seq = rn
0 голосов
/ 20 мая 2019

Вы можете попробовать синтаксис UPDATE ... FROM ..., который позволяет использовать JOIN.Вот фрагмент кода вместе с тестовыми данными:

declare @tbl table (seq int, Acc varchar(10), RecId int, trnDate date);
insert into @tbl values
(null, '12344', 2, '2019-05-05'),
(null, '12344', 1, '2019-05-06'),
(null, '12344', 5, '2019-05-04'),
(null, '12344', 5, '2019-05-03'),
(null, '12355', 1, '2019-05-05');

select * from @tbl

update t1 set t1.seq = t2.rn
from @tbl t1 join (
    select row_number() over (order by RecId, trnDate) rn,
           trnDate,
           RecId,
           Acc
    from @tbl
    where Acc = '12344'
) t2 on t1.trnDate = t2.trnDate and t1.RecId = t2.RecId and t1.Acc = t2.Acc

select * from @tbl
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...