在Oracle 10g中,我需要使用表B中的数据更新表A.
表A具有LOCATION,TRANDATE和STATUS。
表B具有LOCATION,STATUSDATE和STATUS
我需要使用表B中的STATUS列更新表A中的STATUS列,其中STATUSDATE是最大日期,包括该LOCATION的TRANDATE(基本上,我得到当时位置的状态特定交易)。
我有一个PL / SQL程序可以做到这一点,但我知道必须有一种方法让它使用分析工作,我一直在敲我的脑袋太久了。
谢谢!
答案 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_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);
答案 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 );