根据另一个表中的最新响应更新1表中的状态

时间:2013-09-10 06:29:47

标签: oracle

我正在使用Oracle 11g R1数据库。请帮助我解决我想要实现的目标。

Table 1
-------

ID  Name    Status
--  ----    ------
1   John    0
2   Chris   0
3   Joel    0
4   Mike    0
5   Henry   0


Table 2
-------

ID  Status  ResponseDate
--  ------  -------------
1   0       1-Jan-2013
1   1       31-Jan-2013
1   2       3-Feb-2013
1   6       19-Jan-2013
2   6       3-Mar-2013
2   2       1-Mar-2013
2   1       4-Mar-2013
2   0       2-Mar-2013
3   0       3-Feb-2013
3   1       2-Feb-2013
3   2       1-Feb-2013
4   2       4-Apr-2013
4   1       6-Apr-2013
4   0       1-Apr-2013
5   1       31-Mar-2013
5   6       4-Apr-2013
5   3       10-Jan-2013

我想根据Table1.status返回的最新回复更新ID。因此,Table1中的状态应最终更新如下,

ID  Name         Status
--  ----        ------
1   John        2
2   Chris       1
3   Joel        0
4   Mike        1
5   Henry       6

3 个答案:

答案 0 :(得分:1)

update table1 t1 
   set status = (
     select max(status) keep (dense_rank last order by responsedate)  
       from table2 t2 
      where t2.id = t1.id
   );

答案 1 :(得分:0)

update table1 t1
set status = 
(
  select status 
  from table2  
  where id = t1.id and responseDate = 
  (
        select max(responseDate) 
        from table2 
        where id = t1.id
  )
)

答案 2 :(得分:0)

当然,您可以在每次需要时更新status的{​​{1}}列,但您可以考虑创建一个视图,例如table1,它会为您提供新鲜的和最新信息:

v_table_1

结果:

create or replace view V_Table1 as
   select max(t.id)   as id
        , max(t.name) as name
        , max(q.status) keep(dense_rank first 
                             order by q.ResponseDate desc) as status
    from table_1 t
    join table_2 q
      on (q.id = t.id)
   group by t.id