2016-06-21 23 views
-1

Ich habe eine Tabelle wie dieseUpdate-Tabelle mit einer anderen Spalte in der gleichen Tabelle

Test_order

Order Num Order ID Prev Order ID 
    987Y7OP89 919325  0 
    987Y7OP90 1006626 919325 
    987Y7OP91 1029350 1006626 
    987Y7OP92 1756689 0 
    987Y7OP93 1756690 0 
    987Y7OP94 1950100 1756690 
    987Y7OP95 1977570 1950100 
    987Y7OP96 2160462 1977570 
    987Y7OP97 2288982 2160462 

Zieltabelle wie unten sein sollte,

Order Num Order ID Prev Order ID 
987Y7OP89 919325  0 
987Y7OP90 1006626  919325 
987Y7OP91 1029350  1006626 
987Y7OP92 1756689  1029350 
987Y7OP93 1756690  1756689 
987Y7OP94 1950100  1756690 
987Y7OP95 1977570  1950100 
987Y7OP96 2160462  1977570 
987Y7OP97 2288982  2160462 
987Y7OP97 2288900  2288982 

vorherige Order ID aktualisiert werden soll mit der Bestell-ID aus dem vorherigen Datensatz aus derselben Tabelle.

Ich versuche, eine Dummy-Datensatz zu erstellen und update..but es nicht funktioniert ..

WITH A AS 
(SELECT ORDER_NUM, ORDER_ID, PRIOR_ORDER_ID,ROWNUM RID1 FROM TEST_ORDER),B AS (SELECT ORDER_NUM, ORDER_ID, PRIOR_ORDER_ID,ROWNUM+1 RID2 FROM TEST_ORDER) 
SELECT A.ORDER_NUM,B.ORDER_ID,A.PRIOR_ORDER_ID,B.PRIOR_ORDER_ID FROM A,B WHERE RID1 = RID2 
+1

Wo ist Ihre 'update' Aussage? – sstan

Antwort

0

in sQL-Server, den Sie nicht Fensterfunktion in Update-Anweisung, nicht positiv denken, aber nicht so in oder verwenden können entweder. Wie auch immer, um zu umgehen, dass Sie einfach eine Cte ​​wie folgt aktualisieren können.

WITH cte AS (
    SELECT 
     * 
     ,NewPreviousOrderId = LAG(OrderId,1,0) OVER (ORDER BY OrderNum) 
    FROM 
     TableName 
) 

UPDATE cte 
    SET PrevOrderId = NewPreviousOrderId 

Und wenn Sie bei der ROW_NUMBER Route bleiben möchten, würden Sie dies tun.

;WITH cte AS (
    SELECT 
     * 
     ,ROW_NUMBER() OVER (ORDER BY OrderNum) AS RowNum 
    FROM 
     TableName 
) 

UPDATE c1 
    SET PrevOrderId = c2.OrderId 
FROM 
    cte c1 
    INNER JOIN cte c2 
    ON (c1.RowNum - 1) = c2.RowNum 
Verwandte Themen