2016-06-21 4 views
-1

私はこの更新テーブル

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 

ターゲット表が

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 

前の注文IDが更新されるべきで、以下のようにする必要がありますのようなテーブルを持っています同じ表の前のレコードの注文IDを使用してください。

私は

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

あなたの 'update'ステートメントはどこですか? – sstan

答えて

0

いずれかのエール。とにかくこれを回避するには、次のようにcteを更新するだけです。

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

UPDATE cte 
    SET PrevOrderId = NewPreviousOrderId 

あなたがROW_NUMBERルートに固執したい場合は、これを行う方法です。

;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 
1

...ダミーのデータセットを作成し、それが働いていないupdate..butしようとしているあなたは、前の順番から値をピックアップしてOracles Analytical Functions(とも呼ばれるウィンドウ関数)を使用することができます:あなたが更新文ではなく、ポジティブにウィンドウ関数を使用することはできませんが、かでそうは思わない、SQLサーバーで

UPDATE Test_Order 
SET ORDERID = LAG(ORDERID, 1, 0) OVER (ORDER BY ORDERNUM ASC) 
WHERE PrevOrderId = 0 

See here for the documentation on LAG()