it-swarm.com.de

SQL Update mit row_number ()

Ich möchte meine Spalte CODE_DEST mit einer inkrementellen Nummer aktualisieren. Ich habe:

CODE_DEST   RS_NOM
null        qsdf
null        sdfqsdfqsdf
null        qsdfqsdf

Ich möchte es aktualisieren, um zu sein:

CODE_DEST   RS_NOM
1           qsdf
2           sdfqsdfqsdf
3           qsdfqsdf

Ich habe diesen Code ausprobiert:

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

Dies funktioniert nicht wegen der )

Ich habe auch versucht:

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

Aber das funktioniert auch nicht wegen der Gewerkschaft.

Wie kann ich eine Spalte mit der Funktion ROW_NUMBER() in SQL Server 2008 R2 aktualisieren?

92
user609511
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
39
user609511

Eine weitere Option

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

versuche dies

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

56
vasin1987

Ihr zweiter Versuch ist in erster Linie fehlgeschlagen, weil Sie den CTE so benannt haben wie die zugrunde liegende Tabelle und den CTE so aussehen ließen, als wäre er ein rekursiver CTE , da er im Wesentlichen referenziert selbst. Ein rekursiver CTE muss eine bestimmte Struktur haben, die die Verwendung des Mengenoperators UNION ALL Erfordert.

Stattdessen hätten Sie dem CTE auch einen anderen Namen geben und die Zielspalte hinzufügen können:

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
15
Andriy M

Dies ist eine modifizierte Version der Antwort von @Aleksandr Fedorenko, die eine WHERE-Klausel hinzufügt:

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

Durch Hinzufügen einer WHERE-Klausel wurde die Leistung für nachfolgende Aktualisierungen massiv verbessert. Sql Server scheint die Zeile zu aktualisieren, auch wenn der Wert bereits vorhanden ist und dies einige Zeit in Anspruch nimmt. Wenn Sie also die where-Klausel hinzufügen, werden nur die Zeilen übersprungen, in denen sich der Wert nicht geändert hat. Ich muss sagen, ich war erstaunt, wie schnell meine Abfrage ausgeführt werden konnte.

Haftungsausschluss: Ich bin kein DB-Experte und verwende PARTITION BY für meine Klausel. Daher kann es sein, dass bei dieser Abfrage nicht genau die gleichen Ergebnisse erzielt werden. Für mich ist die fragliche Spalte die bezahlte Bestellung eines Kunden, sodass sich der Wert im Allgemeinen nicht ändert, sobald er festgelegt ist.

Stellen Sie außerdem sicher, dass Sie über Indizes verfügen, insbesondere wenn die SELECT-Anweisung eine WHERE-Klausel enthält. Ein gefilterter Index hat sich für mich hervorragend bewährt, da ich basierend auf dem Zahlungsstatus gefiltert habe.


Meine Anfrage mit PARTITION von

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

Der Teil 'IS NOT NULL' ist nicht erforderlich, wenn die Spalte nicht nullwertfähig ist.


Wenn ich sage, dass die Leistungssteigerung massiv war, meine ich, dass sie beim Aktualisieren einer kleinen Anzahl von Zeilen im Wesentlichen sofort erfolgte. Mit den richtigen Indizes konnte ich ein Update erzielen, das genauso viel Zeit in Anspruch nahm wie die 'innere' Abfrage selbst:

  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
13
Simon_Weaver

Wenn die Tabelle keine Beziehung hat, kopieren Sie einfach alle in die neue Tabelle mit der Zeilennummer und entfernen Sie die alte und benennen Sie die neue mit der alten um.

Wählen Sie RowNum = ROW_NUMBER () OVER (ORDER BY (SELECT NULL)), * INTO cdm.dbo.SALES2018 aus (wählen Sie * aus SALE2018 aus) als SalesSource

1
Ubaid Mughal

Ich habe das für meine Situation getan und gearbeitet

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
1
Arun Prasad E S

Einfache und einfache Möglichkeit, den Cursor zu aktualisieren

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
1
Rahim Surani