2011-09-01 66 views
0

MERGE我想要做這樣的事情在9i中使用9i中

MERGE INTO SAT_DEMANDS D 
     USING (SELECT DISTINCT d1.PRODUCT_ID AS product_id, CA.CUST_ID as allocated_cust 
     FROM CDP_MPS_ALLOCATION CA, sat_demands d1 
     WHERE substr(d1.product_id,1,instr(d1.product_id,'_VIRTUAL',1)-1) = ca.prod_id(+)) MC 
     ON (D.PRODUCT_ID = MC.product_id AND D.CUSTOMER_ID = MC.allocated_cust) 
     WHEN matched then 
     Update set D.alloc_cust_id_s = CASE WHEN mc.allocated_cust IS NULL THEN 'FREE' 
             ELSE mc.allocated_cust||':'||'FREE' 
             END; 

請幫幫忙! Oracle 9i不允許我這樣做,因爲它沒有匹配時沒有。我如何在9i中取得相同的結果?

回答

0

使用ROWID方法:

FOR r in (SELECT D.rowid, MC.allocated_cust FROM 
      (SELECT DISTINCT d1.PRODUCT_ID AS product_id, CA.CUST_ID as allocated_cust 
       FROM CDP_MPS_ALLOCATION CA, sat_demands d1 
      WHERE substr(d1.product_id,1,instr(d1.product_id,'_VIRTUAL',1)-1) = ca.prod_id(+) 
      ) MC 
      join SAT_DEMANDS D 
      ON (D.PRODUCT_ID = MC.product_id AND D.CUSTOMER_ID = MC.allocated_cust) 
     ) 
LOOP 

     Update SAT_DEMANDS D 
     set D.alloc_cust_id_s = CASE WHEN r.allocated_cust IS NULL THEN 'FREE' 
            ELSE r.allocated_cust||':'||'FREE' 
             END 
     where rowid=r.rowid; 
END LOOP; 
+0

喜林,這正是我所需要的東西。非常感謝你的幫助! – user663354

0

的Oracle 9i中確實WHEN NOT MATCHED條款。但不能使用更新。

你的情況,你不需要合併,UPDATE應該做你想要什麼:

UPDATE sat_demands d 
    SET alloc_cust_id_s = nvl((SELECT mc.allocated_cust || ':FREE' 
           FROM mc 
           WHERE d.product_id = mc.product_id 
           AND d.customer_id = mc.allocated_cust), 
          'FREE') 
+0

他的查詢沒有匹配時沒有,不是oracle的合併:) –

+0

@弗洛林:我認爲OP想更新表,不管有沒有匹配。我可能錯誤地解釋了這個問題:) –

+0

當然,他想更新表格,除了沒有匹配(product_id,customer_id)的情況外,簡單的更新幾乎可以。在這種情況下,他應該設置alloc_cust_id_s = nvl(newvalue,alloc_cust_id_s)。即以相同的值更新。 –