2016-06-21 7 views
-1

나는업데이트 테이블

이 이 이
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를 업데이트해야합니다,이

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 

대상 테이블과 같은 테이블이 아래와 같이해야해야 동일한 테이블의 이전 레코드에서 주문 ID와 함께. 나는 더미 데이터 세트를 생성하고 작동하지 않는 update..but하기 위해 노력하고있어

..

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

당신은 이전 주문에서 값을 선택하는 Oracles Analytical Functions (또한 윈도우 함수)를 사용할 수 있습니다 :

는 update 문에서 윈도우 기능을 사용할 수 없습니다 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()