use*_*511 96 sql-server sql-server-2008-r2 sql-update
我想用增量号更新我的列CODE_DEST.我有:
CODE_DEST   RS_NOM
null        qsdf
null        sdfqsdfqsdf
null        qsdfqsdf
我想将其更新为:
CODE_DEST   RS_NOM
1           qsdf
2           sdfqsdfqsdf
3           qsdfqsdf
我试过这段代码:
UPDATE DESTINATAIRE_TEMP
SET CODE_DEST = TheId 
FROM (SELECT  Row_Number()   OVER (ORDER BY [RS_NOM]) AS TheId FROM DESTINATAIRE_TEMP)
这不起作用,因为 )
我也尝试过:
WITH DESTINATAIRE_TEMP AS
  (
    SELECT 
    ROW_NUMBER() OVER (ORDER BY [RS_NOM] DESC) AS RN
    FROM DESTINATAIRE_TEMP
  )
UPDATE DESTINATAIRE_TEMP SET CODE_DEST=RN
但由于结合,这也行不通.
如何使用ROW_NUMBER()SQL Server 2008 R2中的函数更新列?
Ale*_*nko 170
还有一个选择
UPDATE x
SET x.CODE_DEST = x.New_CODE_DEST
FROM (
      SELECT CODE_DEST, ROW_NUMBER() OVER (ORDER BY [RS_NOM]) AS New_CODE_DEST
      FROM DESTINATAIRE_TEMP
      ) x
vas*_*987 60
DECLARE @id INT 
SET @id = 0 
UPDATE DESTINATAIRE_TEMP
SET @id = CODE_DEST = @id + 1 
GO 
试试这个
use*_*511 42
With UpdateData  As
(
SELECT RS_NOM,
ROW_NUMBER() OVER (ORDER BY [RS_NOM] DESC) AS RN
FROM DESTINATAIRE_TEMP
)
UPDATE DESTINATAIRE_TEMP SET CODE_DEST = RN
FROM DESTINATAIRE_TEMP
INNER JOIN UpdateData ON DESTINATAIRE_TEMP.RS_NOM = UpdateData.RS_NOM
And*_*y M 15
您的第二次尝试失败主要是因为您将CTE命名为与基础表相同,并使CTE看起来好像是一个递归CTE,因为它基本上引用了它自己.一个递归CTE必须有其需要使用的具体结构UNION ALL集合运算符.
相反,您可以给CTE一个不同的名称,并将目标列添加到它:
With SomeName As
(
SELECT 
CODE_DEST,
ROW_NUMBER() OVER (ORDER BY [RS_NOM] DESC) AS RN
FROM DESTINATAIRE_TEMP
)
UPDATE SomeName SET CODE_DEST=RN
Sim*_*ver 13
这是@Aleksandr Fedorenko添加WHERE子句的答案的修改版本:
UPDATE x
SET x.CODE_DEST = x.New_CODE_DEST
FROM (
      SELECT CODE_DEST, ROW_NUMBER() OVER (ORDER BY [RS_NOM]) AS New_CODE_DEST
      FROM DESTINATAIRE_TEMP
      ) x
WHERE x.CODE_DEST <> x.New_CODE_DEST AND x.CODE_DEST IS NOT NULL
通过添加WHERE子句,我发现性能大大提高了后续更新.即使值已经存在并且需要花费时间,Sql Server似乎也会更新该行,因此添加where子句会使其跳过值未更改的行.我不得不说我对它运行查询的速度感到惊讶.
免责声明:我不是数据库专家,我正在为我的子句使用PARTITION BY,因此对于此查询可能不完全相同.对我来说,相关列是客户的付款订单,因此一旦设置,该值通常不会更改.
还要确保您有索引,特别是如果SELECT语句上有WHERE子句.过滤后的索引对我很有用,因为我根据付款状态进行过滤.
我的查询使用PARTITION by
UPDATE  UpdateTarget
SET     PaidOrderIndex = New_PaidOrderIndex
FROM
(
    SELECT  PaidOrderIndex, SimpleMembershipUserName, ROW_NUMBER() OVER(PARTITION BY SimpleMembershipUserName ORDER BY OrderId) AS New_PaidOrderIndex
    FROM    [Order]
    WHERE   PaymentStatusTypeId in (2,3,6) and SimpleMembershipUserName is not null
) AS UpdateTarget
WHERE UpdateTarget.PaidOrderIndex <> UpdateTarget.New_PaidOrderIndex AND UpdateTarget.PaidOrderIndex IS NOT NULL
-- test to 'break' some of the rows, and then run the UPDATE again
update [order] set PaidOrderIndex = 2 where PaidOrderIndex=3
如果列不可为空,则不需要"IS NOT NULL"部分.
当我说性能提升很大时,我的意思是在更新少量行时它基本上是瞬时的.使用正确的索引,我能够实现一个更新,它花费的时间与"内部"查询本身相同:
  SELECT  PaidOrderIndex, SimpleMembershipUserName, ROW_NUMBER() OVER(PARTITION BY SimpleMembershipUserName ORDER BY OrderId) AS New_PaidOrderIndex
    FROM    [Order]
    WHERE   PaymentStatusTypeId in (2,3,6) and SimpleMembershipUserName is not null
我这样做是为了我的情况并工作
WITH myUpdate (id, myRowNumber )
AS
( 
    SELECT id, ROW_NUMBER() over (order by ID) As myRowNumber
    FROM AspNetUsers
    WHERE  UserType='Customer' 
 )
update AspNetUsers set EmployeeCode = FORMAT(myRowNumber,'00000#') 
FROM myUpdate
    left join AspNetUsers u on u.Id=myUpdate.id
| 归档时间: | 
 | 
| 查看次数: | 152479 次 | 
| 最近记录: |