使用另一个表的最大日期更新表

时间:2010-03-19 16:19:56

标签: sql oracle plsql

在Oracle 10g中,我需要使用表B中的数据更新表A.

表A具有LOCATION,TRANDATE和STATUS。

表B具有LOCATION,STATUSDATE和STATUS

我需要使用表B中的STATUS列更新表A中的STATUS列,其中STATUSDATE是最大日期,包括该LOCATION的TRANDATE(基本上,我得到当时位置的状态特定交易)。

我有一个PL / SQL程序可以做到这一点,但我知道必须有一种方法让它使用分析工作,我一直在敲我的脑袋太久了。

谢谢!

2 个答案:

答案 0 :(得分: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_atable_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);

答案 1 :(得分: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 );