我正在尝试执行以下SQL查询,以更新一个名为seq
的列,其中具有特定ID的编号序列,但会引发错误:
在关键字"顺序"附近的语法不正确。
DECLARE @id INT
SET @id = 0
UPDATE T_TRNHIST
SET @id = seq = @id + 1
WHERE Acc='12344'
OPTION ( MAXDOP 1 )
ORDER BY Recid, trnDate
我在哪里可以错?
您不能在更新语句中使用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
您可以尝试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