代码之家  ›  专栏  ›  技术社区  ›  moleboy

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

  •  1
  • moleboy  · 技术社区  · 14 年前

    在Oracle10g中,我需要用表B中的数据更新表A。

    表A包含位置、事务日期和状态。

    表B具有位置、状态日期和状态

    我需要用表B中的状态列更新表A中的状态列,其中statusDate是该位置的最大日期,包括该位置的TranDate(基本上,我是在特定事务处理时获取该位置的状态)。

    我有一个pl/sql过程可以做到这一点,但我知道一定有一种方法可以让它通过分析来工作,而且我已经花了太长时间。

    谢谢!

    2 回复  |  直到 14 年前
        1
  •  2
  •   Vincent Malgrat    14 年前

    这应该可以让您开始(这里的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 ,在这种情况下,将状态更新为空。如果只想更新 表A 有相应匹配的 表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);
    
        2
  •  0
  •   Dan    14 年前

    这是一个具有分析功能的版本。如图所示,它将更新表中的所有行。要更新特定行,请添加筛选器。

    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 );