Oracle 11g:用表 B 中的最新记录替换表 A 上的记录

Posted

技术标签:

【中文标题】Oracle 11g:用表 B 中的最新记录替换表 A 上的记录【英文标题】:Oracle 11g: substitute record on Table A with latest record from Table B 【发布时间】:2019-05-05 12:20:28 【问题描述】:

我有 2 个表,表 A 和表 B。我需要返回表 A 中的所有记录,但如果 ID 存在,我需要将 COL_A 替换为 TABLE_B 中的 COL_A 的最新值。

TABLE_A                       TABLE_B
ID COL_A                      A_ID   COL_A  CREATED_DATE
1  AAA                        1      AA1    1/11/18
2  BBB                        1      AA2    1/12/18
3  CCC                        3      CC1    1/12/18

预期输出:

ID COL_A
1  AA2
2  BBB
3  CC1

我可以使用 Oracle 12c 执行以下操作,但不能在 11g 上执行。需要有关如何查询 11g 的帮助?

select ID, 
NVL((select * from (select FIRST_VALUE(COL_A) OVER (ORDER BY CREATED_DATE DESC) from TABLE_B WHERE A_ID=A.ID) where ROWNUM=1),COL_A) AS COL_A
from TABLE_A A

【问题讨论】:

我在这里看不到明显的连接条件。你为什么要这样组织你的表格? 你可以使用merge声明 @TimBiegeleisen 您将如何重组它们? 对于初学者,请在两个表之间创建干净的连接键,这样您就不必使用 SQL Olympics 来完成原本相当简单的查询。 @TimBiegeleisen 好的...回到我最初的问题,以我的例子为例,你将如何构建它们? 【参考方案1】:

您缺少 2 个表和一个子查询之间的连接来检查最大日期:

select a.ID, NVL(b.col_a, a.col_a) 
from TABLE_A a left outer join TABLE_B b 
on a.id = b.a_id 
and b.created_date = 
(select max(innerB.createdDate) from Table_B innerB where innerB.a_id = a.id);

试试这个,如果出现错误,请告诉我

【讨论】:

完美!谢谢。 在相关说明中,我无法从此查询中创建视图。它说“ORA-01799:列不能外连接到子查询”。有任何想法吗?再次感谢。【参考方案2】:

我会倾向于使用窗口函数:

select a.id, coalesce(b.col_a, a.col_a) as col_a
from a left join
     (select b.*,
             row_number() over (partition by b.a_id order by b.created_date) as seqnum
      from b
     ) b
     on b.a_id = a.id and b.seqnum = 1;

这似乎比使用join 相关子查询的版本简单得多。

【讨论】:

以上是关于Oracle 11g:用表 B 中的最新记录替换表 A 上的记录的主要内容,如果未能解决你的问题,请参考以下文章

Oracle11g里的Users表空间可以删除吗

Oracle 11g - 如何使用表连接从函数返回记录

oracle 11g expdp 备份解决空表无法备份

Oracle 11g:从 CLOB 和表更新中读取 XML 记录

oracle 如何根据一个表中记录的变动更新另外一个表中相应的字段

在MYSQL中如何用一个字段的值替换另一个字段的值