在 Oracle 10g 中,我需要使用表 B 中的数据更新表 A。
表 A 包含位置、交易日期和状态。
表 B 包含 LOCATION、STATUSDATE 和 STATUS
我需要使用表 B 中的状态列更新表 A 中的状态列,其中 STATUSDATE 是截至并包括该位置的 TRANDATE 的最大日期(基本上,我正在获取当时位置的状态特定交易)。
我有一个 PL/SQL 过程可以做到这一点,但我知道必须有一种方法可以使用分析让它工作,而且我已经绞尽脑汁了。
谢谢!
最佳答案
这应该可以帮助您开始(这里的 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);
关于sql - 使用另一个表的最大日期更新一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2478849/