ROW_NUMBER () OVER mit Untersatz

Ich habe die Informationen aus anderen Threads herausgeholt und was nicht und hast mich ganz nah bekommen, aber ich vermisse hier etwas zu tun was ich tun muss. Hier ist mein Code, wie ich es jetzt in einem SQL-Abfrage-windows habe?

WITH n AS ( SELECT sub_idx AS current_id, ROW_NUMBER() OVER (PARTITION BY EID ORDER BY alt_sub_idx) AS new_id FROM GETT_Documents ) UPDATE GETT_Documents SET sub_idx = n.new_id FROM n WHERE EID = 'AC-1.1.i'; 

Dies schien, als ob es funktionieren sollte, aber anstatt die sub_idx Spalte von 1 bis 11 zu nummerieren, setzte man alle 1 in diese Spalte.

Ansicht der relevanten Zeilen

Kann jemand mit scharfen Augen den Fehler meiner pathe zuerst aussprechen? Dann vermuten Sie vielleicht, wie ich das ändern könnte, um durch 10's anstelle von einstelligen Ziffern zu erhöhen, weil ich mich umdrehen möchte und das gleiche mit der alt_sub_idx Spalte tun, nachdem ich dies zu dieser Spalte getan habe, aber in Schritten von 10.

Grüße, Ken …

 DECLARE @GETT_DOCUMENTS TABLE (DID INT, EID VARCHAR(1), SUB_IDX INT, ALT_SUB_IDX INT) INSERT INTO @GETT_DOCUMENTS VALUES (1,'A',0,10), (2,'A',0,20), (3,'A',0,30), (4,'A',0,40), (5,'A',0,50), (6,'A',0,60), (7,'A',0,70), (8,'A',0,80), (9,'A',0,90), (10,'A',0,100), (11,'A',0,110), (12,'A',0,120) ;WITH n AS ( SELECT DID AS DID, sub_idx AS current_id, ROW_NUMBER() OVER (PARTITION BY EID ORDER BY alt_sub_idx) AS new_id FROM @GETT_Documents ) --SELECT * FROM N UPDATE @GETT_Documents SET sub_idx = n.new_id FROM @GETT_Documents G JOIN n ON N.DID = G.DID WHERE EID = 'A'; SELECT * FROM @GETT_Documents 

Ihr UPDATE ist nicht korreliert, also packt es gerade mal die erste Zeile aus der cte. Es muss so sein:

 ... UPDATE d SET sub_idx = n.new_id FROM n INNER JOIN GETT_Documents d ON d.sub_idx=n.sub_idx WHERE d.EID = 'AC-1.1.i'; 

SQL server unterstützt aktualisierbare CTES, so dass Sie die JOIN nicht benötigen:

 WITH toupdate AS ( SELECT sub_idx AS current_id, ROW_NUMBER() OVER (PARTITION BY EID ORDER BY alt_sub_idx) AS new_id FROM GETT_Documents ) UPDATE toupdate SET sub_idx = new_id WHERE EID = 'AC-1.1.i'; 

Das Problem mit Ihrer Abfrage ist der Mangel an Join-Zustand. Es ist ein cross join , also gibt es kein Sprichwort, welche Zeile für das Update verwendet wird. Allerdings braucht die Abfrage überhaupt keine Verbindung.

Entfernen Sie die Partition mit der Klausel. Eid könnte eindeutig sein, weshalb du 1's in der Ausgabe erhältst.

P Lachs lieferte diesen Code, den ich adoptiert habe und der einzige Grund für mich, diese Antwort hier zu posten, ist so, um zu zeigen, was ich in der gespeicherten Prozedur als endgültiges Ergebnis platzieren werde. Dies funktioniert einwandfrei und zählt sowohl die Spalte sub_idx als auch alt_sub_idx wie es sollte. Unten ist der eigentliche Code, den ich verwenden werde und die Ergebnisse, um mit dem zu vergleichen, was in meinem ursprünglichen Post gepostet wurde.

Dank P Lachs sowie allen anderen, die hier beigetragen haben, habe ich viel von allen gelernt!

 WITH n AS ( SELECT DID AS DID, sub_idx AS current_id, ROW_NUMBER() OVER (PARTITION BY EID ORDER BY alt_sub_idx) AS new_id FROM GETT_Documents ) --SELECT * FROM N UPDATE GETT_Documents SET sub_idx = n.new_id FROM GETT_Documents G JOIN n ON N.DID = G.DID WHERE EID = 'AC-1.1.i'; 

(NETZIERT WIE DID, Alt_sub_idx AS current_id, ROW_NUMBER () OVER (PARTITION BY EID ORDER BY sub_idx) * 10 AS new_id FROM GETT_Documents) –SELECT * FROM N UPDATE GETT_Documents SET alt_sub_idx = n.new_id FROM GETT_Documents G JOIN n ON N.DID = G.DID WHERE EID = 'AC-1.1.i';

die Ausgabe

Zwei Optionen:

  1. Entweder ein Attribut auf einer höheren Ebene als die vorhandene Spalte in der Partition By-Klausel verwenden

ODER

  1. Wie von Akshey in der vorherigen Antwort vorgeschlagen, entfernen Sie die Partition von insgesamt.