1

我正在使用 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

我想根据's 返回的Table1.status最新响应进行更新。ID所以,状态Table1最终应该更新如下,

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

3 回答 3

1
update table1 t1 
   set status = (
     select max(status) keep (dense_rank last order by responsedate)  
       from table2 t2 
      where t2.id = t1.id
   );
于 2013-09-10T06:45:37.940 回答
0

当然,您可以在每次需要时更新status列,但您可以考虑创建一个视图,例如,它将为您提供最新的信息:table1v_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

结果:

   select *
     from V_Table1

       ID1 NAME1     STATUS
  -------- ----- ----------
         1 John           2
         2 Chris          1
         3 Joel           0
         4 Mike           1
         5 Henry          6
于 2013-09-10T06:52:39.463 回答
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
  )
)
于 2013-09-10T06:40:47.150 回答