Обновление SQL с номером строки()



Я хочу обновить свой столбец 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?

663   7  

7 ответов:

еще один вариант

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
DECLARE @id INT 
SET @id = 0 
UPDATE DESTINATAIRE_TEMP
SET @id = CODE_DEST = @id + 1 
GO 

попробуй такое

http://www.mssqltips.com/sqlservertip/1467/populate-a-sql-server-column-with-a-sequential-number-not-using-an-identity/

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

ваша вторая попытка не удалась в первую очередь потому, что вы назвали CTE так же, как и базовую таблицу, и сделали CTE похожим на рекурсивный CTE, потому что он по существу ссылается на себя. А рекурсивный CTE должна иметь определенную структуру, которая требует использования UNION ALL оператор set.

вместо этого вы могли бы просто дать 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

Это модифицированная версия ответа @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 для своего предложения, поэтому для этого запроса могут быть не совсем те же результаты. Для меня рассматриваемый столбец является платным заказом клиента, поэтому значение обычно не меняется после его установки.

также убедитесь, что у вас есть индексы, особенно если у вас есть предложение WHERE в инструкции SELECT. Отфильтрованный индекс отлично работал для меня, поскольку я фильтровал на основе статусов платежей.


мой запрос с помощью раздела на

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' не требуется, если столбец не имеет значения 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

простой и легкий способ обновить курсор

UPDATE Cursor
SET Cursor.CODE = Cursor.New_CODE
FROM (
  SELECT CODE, ROW_NUMBER() OVER (ORDER BY [CODE]) AS New_CODE
  FROM Table Where CODE BETWEEN 1000 AND 1999
  ) Cursor

Я сделал это для моей ситуации и работал

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

Comments

    Ничего не найдено.