SQL-update met Row_Number ()

Ik wil mijn kolomcode_dest bijwerken met een incrementaal nummer. Ik heb:

CODE_DEST   RS_NOM
null        qsdf
null        sdfqsdfqsdf
null        qsdfqsdf

Ik wil het graag bijwerken als:

CODE_DEST   RS_NOM
1           qsdf
2           sdfqsdfqsdf
3           qsdfqsdf

Ik heb deze code geprobeerd:

UPDATE DESTINATAIRE_TEMP
SET CODE_DEST = TheId 
FROM (SELECT  Row_Number()   OVER (ORDER BY [RS_NOM]) AS TheId FROM DESTINATAIRE_TEMP)

Dit werkt niet vanwege de )

Ik heb ook geprobeerd:

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

Maar dit werkt ook niet vanwege de Unie.

Hoe kan ik een kolom bijwerken met behulp van de ROW_NUMBER()functie in SQL Server 2008 R2?


Antwoord 1, Autoriteit 100%

Nog een optie

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

Antwoord 2, Autoriteit 40%

DECLARE @id INT 
SET @id = 0 
UPDATE DESTINATAIRE_TEMP
SET @id = CODE_DEST = @id + 1 
GO 

Probeer dit

http://www.msqltips.com/sqlservertip/1467/populate-a-sql-server-column-with-A—ANTILE-NUMFORM-NOT-USING-AN-ISTITYITEIT/


Antwoord 3, Autoriteit 24%

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

Antwoord 4, Autoriteit 10%

Uw tweede poging is in de eerste plaats mislukt omdat u de CTE dezelfde als de onderliggende tabel hebt genoemd en de CTE uitziet alsof het een recursieve CTE was, omdat het in hoofdzaak zichzelf heeft verwezen. A recursief CTE moet een specifieke structuur hebben die het gebruik van de UNION ALLSet Operator.

In plaats daarvan had u de CTE een andere naam hebt gegeven, evenals de doelkolom eraan toegevoegd:

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

Antwoord 5, Autoriteit 9%

Dit is een gewijzigde versie van @ALEKSANDR FEDORENKO’S ANTWOORD TOEPASSING A WHANE CLAUSULES:

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

Door een inhoud toe te voegen, vond ik de prestatie massaal verbeterd voor latere updates. SQL Server lijkt de rij bij te werken, zelfs als de waarde al bestaat en het kost tijd om dit te doen, dus het toevoegen van de waarheid waarmee de rijen het gewoon overslaan over rijen waar de waarde niet is gewijzigd. Ik moet zeggen dat ik verbaasd was over hoe snel het mijn vraag zou kunnen draaien.

DISCLAIMER: Ik ben geen DB-expert, en ik gebruik partitie voor mijn clausule, dus het is misschien niet precies dezelfde resultaten voor deze query. Voor mij is de betreffende kolom een ​​bestelling van een klant, dus de waarde verandert over het algemeen niet als het is ingesteld.

Zorg er ook voor dat u indexen hebt, vooral als u een clausule op de geselecteerde verklaring hebt. Een gefilterde index werkte goed voor mij omdat ik het filteren op basis van betalingsstatussen.


Mijn zoekopdracht met partitie door

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

Het deel ‘is niet null’ is niet vereist als de kolom niet onmerkbaar is.


Als ik zeg dat de prestatietoename massief was, bedoel ik dat het in wezen onmiddellijk was bij het bijwerken van een klein aantal rijen. Met de juiste indexen was ik in staat om een ​​update te bereiken die dezelfde hoeveelheid tijd heeft genomen als de ‘innerlijke’ query van zichzelf:

 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

Antwoord 6, Autoriteit 2%

Ik deed dit voor mijn situatie en werkte

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

Antwoord 7

In mijn geval heb ik een nieuwe kolom toegevoegd en wilde het bijwerken met het Equevilat Record Number voor de hele tabel

id  name       new_column (ORDER_NUM)
1   Ali        null
2   Ahmad      null
3   Mohammad   null
4   Nour       null
5   Hasan      null
6   Omar       null

Ik heb deze query geschreven om de nieuwe kolom te laten bevolgen met het rijnummer

UPDATE My_Table
SET My_Table.ORDER_NUM  = SubQuery.rowNumber
FROM (
         SELECT id ,ROW_NUMBER() OVER (ORDER BY [id]) AS rowNumber
         FROM My_Table
     ) SubQuery
INNER JOIN My_Table ON
        SubQuery.id = My_Table.id

Na het uitvoeren van deze query had ik 1,2,3, … Nummers in mijn nieuwe kolom


Antwoord 8

Eenvoudige en eenvoudige manier om de cursor bij te werken

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

Antwoord 9

Als de tabel geen relatie heeft, kopieert u gewoon alles in een nieuwe tabel met rijnummer en verwijder de oude en hernoem een ​​nieuwe met oude.

Select   RowNum = ROW_NUMBER() OVER(ORDER BY(SELECT NULL)) , * INTO cdm.dbo.SALES2018 from 
(
select * from SALE2018) as SalesSource

Antwoord 10

Ik werk een temp-tabel bij met het eerste optreden van een deel waarbij meerdere delen kunnen worden geassocieerd met een volgnummer. RowID = 1 retourneert de eerste plaats die ik deelneem aan de TMP-tabel en gegevens met behulp van een deel- en volgnummer.

update #Tmp
set 
#Tmp.Amount=@Amount
from 
(SELECT Part, Row_Number()   OVER (ORDER BY [Part]) AS RowId FROM #Tmp
where Sequence_Num=@Sequence_Num
)data
where data.Part=#Tmp.Part
and data.RowId=1
and #Tmp.Sequence_Num=@Sequence_Num

Antwoord 11

Ik heb geen loop-ID om te doen wat “BASHER AL-MOMANI” is gesuggereerd.
Ik heb zoiets gedaan: (kwam aan bij mijn tafel op mezelf, gewoon om het rij nummer te krijgen)

update T1 set inID = T2.RN
from (select *, ROW_NUMBER() over (order by ID) RN from MyTable) T1
    inner join (select *, ROW_NUMBER() over (order by ID) RN from MyTable) T2 on T2.RN = T1.RN

Other episodes