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 上的记录的主要内容,如果未能解决你的问题,请参考以下文章
Oracle 11g:从 CLOB 和表更新中读取 XML 记录