【问题标题】:Oracle Getting latest value from the other tableOracle 从另一个表中获取最新值
【发布时间】:2017-04-07 18:13:06
【问题描述】:

我有两个表,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     

【问题讨论】:

    标签: sql oracle11g


    【解决方案1】:

    我可能遗漏了一些东西,但这不简单吗:

    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 排名 #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;
    

    【讨论】:

    • 它不是,在我的实际表中,我可能有 PID 值作为 CED 和 ADD,但实际上我可以在其他地方使用它是个好主意。
    • 我已根据您编辑的请求更新了我的答案。我希望这就是你要找的。​​span>
    • 表 1 中有 两列 PID 和 RID。到目前为止,您似乎拥有实际上不需要的 table1 和包含真实数据的 table2。所以删除(即删除)table1,我会说你很好。我不知道您为什么要 update table1 代替。这意味着冗余地存储数据,这是你不应该的。还是 table2 只是你想在之后删除的临时东西?
    • 我还是不明白。在您的示例数据中,您可以从 table2 中获得所有需要的值。所以你可以完全忽略 table1。无需更新任何内容,因为您可以随时通过简单的选择获得想要查看的数据。
    • 我也不明白。当您要查找 CT1 时,使用我的第二个查询并得到 PID = C,RID = R11。你还需要什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多