2010-03-19 134 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);