2010-03-19 114 views
1

在Oracle 10g的最大日期,我需要從表B.與數據來更新表A更新一個表與另一個表

表A具有LOCATION,TRANDATE和狀態。

表B具有LOCATION,STATUSDATE和STATUS

我需要其中STATUSDATE是最大日期高達和包括該TRANDATE該位置更新與來自表B STATUS列於表A中的STATUS柱(基本上,我正在獲取特定交易時的位置狀態)。

我有一個PL/SQL程序可以做到這一點,但我知道必須有一種方法讓它能夠使用分析工作,而且我一直在嘮叨我的頭。

謝謝!

回答

2

這應該讓你開始(在這裏,MAX功能是聚合函數,而不是解析函數):

UPDATE table_a 
    SET status = (SELECT MAX(table_b.status) 
         KEEP (DENSE_RANK FIRST ORDER BY table_b.statusdate DESC) 
        FROM table_b 
        WHERE table_a.location = table_b.location 
        AND table_b.statusdate <= table_a.trandate); 

這將更新中的所有行table_a,即使沒有事先排table_b ,在這種情況下將狀態更新爲NULL。如果你只是想更新table_a那些在table_b您可以添加過濾器的相應匹配的行:

UPDATE table_a 
    SET status = (SELECT MAX(table_b.status) 
         KEEP (DENSE_RANK FIRST ORDER BY table_b.statusdate DESC) 
        FROM table_b 
        WHERE table_a.location = table_b.location 
        AND table_b.statusdate <= table_a.trandate) 
WHERE EXISTS (SELECT NULL 
       FROM table_b 
       WHERE table_a.location = table_b.location 
        AND table_b.statusdate <= table_a.trandate); 
0

這與分析功能的版本。它會更新table_a中的所有行,如圖所示。要更新特定的行,請添加一個過濾器。

update table_a t1 set status = (
     select distinct 
       first_value(t2.status) over (partition by t1.location, t1.trandate order by t2.statusdate desc) 
     from temp_b t2 
     where t1.location = t2.location 
     and t2.statusdate <= t1.trandate);