Oracle从另一个表中获取最新值

时间:2016-11-23 16:23:08

标签: sql oracle11g

我有两个表,table1包含旧值,table2包含最新值,我想在table1中显示最新值,但我没有任何告诉我这是table2中最新值的内容。
例如
表1

CID-----PID-----RID  
CT1-----C-------R1  
CT2-----C-------R2    
CT3-----C-------R3   
CT4-----C-------R4   

表2

CID-----PID----RID      
CT1-----A-------R1  
CT1-----C-------R11  
CT2-----C-------R2    
CT3-----A-------R3   
CT4-----A-------R4  

条件是我必须优先考虑值C以防两个值(A和C)都存在它的RID变化所以需要在输出表中得到它,对于相同的CID和唯一值我将简单替换它来自table2的table1,所以输出将是这样的

表3

CID-----PID----RID   
CT1-----C-------R11  
CT2-----C-------R2    
CT3-----A-------R3   
CT4-----A-------R4     

1 个答案:

答案 0 :(得分:0)

我可能会遗漏一些东西,但这不是简单的:

select cid, max(pid)
from table2
group by cid;

如果您想要完整记录,请改为使用ROW_NUMBER排名:

select cid, pid, rid
from
(
  select cid, pid, rid, row_number() over (partition by cid order by pid desc) as rn
  from table2
)
where rn = 1;

您还可以使用案例表达式进行排名,例如:

(partition by cid order by case pid when 'C' then 1 when 'A' then 2 else 3 end) as rn

更新:现在你终于解释了你的目标......

您想要或多或少地在上面给出的第二个查询。只有您想要来自两个表的数据,您可以使用UNION ALL获得这些数据。您可以轻松地为每一行提供排名:

  • table2 PIM C =>排名#1
  • table2 PIM A =>排名#2
  • table1 rank#3

然后再次获得排名最高的行:

select cid, pid, rid
from
(
  select cid, pid, rid, row_number() over (partition by cid order by rnk) as rn
  from
  (
    select cid, pid, rid, case when pid = 'C' then 1 else 2 end as rnk from table2
    union
    select cid, pid, rid, 3 as rnk from table1
  )
)
where rn = 1;