Oracle:将两个表与一个公共列加上第二个表中的一个附加列(最新生效日期)连接以选择其他列

Posted

技术标签:

【中文标题】Oracle:将两个表与一个公共列加上第二个表中的一个附加列(最新生效日期)连接以选择其他列【英文标题】:Oracle: Joining two table with a common column plus a additional column(latest effective date) from second table to select other column 【发布时间】:2019-05-04 08:15:51 【问题描述】:

将两个表与一个公共列加上第二个表中的一个附加列(最新生效日期)连接起来,以选择另一个列。我加入了所有条件的表,但结果表有重复的记录,因为 Table2 中有多个相同标识符的记录,其中我只需要具有最新生效日期的记录。我正在使用 Oracle。

Table1(A、B、C、D 列);Table2(C、Efft_date、X)、Table3...

加入表后的结果应该如下:A、B、C、X和其他表中的列

X 的值取决于表 2 中 efft_date 的最新/最大值。

其他信息:where 子句中还有其他连接的表和其他条件。

请帮忙加入没有重复的表格

【问题讨论】:

【参考方案1】:

因此您需要根据table2.efft_date 的最大值进一步限制您的结果集。所以你需要一个像这样的子句:

AND table2.efft_date = ( SELECT MAX( table2b.efft_date) 
                           FROM table2 AS table2b
                          WHERE table2b.c = table2.c )

这假定 table2 不能有重复的 efft_date 值。

【讨论】:

我试过这个,但是得到以下错误“ORA-01799:列可能没有外连接到子查询”并且是的,没有重复的 efft_date 值。 听起来您将其放在联接的ON 子句中。这是一个 where 谓词,位于 WHERE 子句中。【参考方案2】:

您需要加入子查询,以便为 c 列的每个值获得 1 个“最新日期”。为此,我建议使用row_number()

select t1.A, t1.B, t1.C, t1.D, t2.x, t2.efft_date
from table1 t1
inner join (
     select c, x, efft_date, row_number() over(partition by c order by efft_date DESC) as rn
     from table2
     ) t2 on t1.c = t2.c and t2.rn = 1
...

请注意,通过按降序排列日期,最近的日期将被分配行号 1。因此连接条件 and rn = 1 将只允许最近的日期包含在结果中。

将顺序更改为升序日期会颠倒过来,只允许最早的日期。

【讨论】:

以上是关于Oracle:将两个表与一个公共列加上第二个表中的一个附加列(最新生效日期)连接以选择其他列的主要内容,如果未能解决你的问题,请参考以下文章

Oracle Join 表与第一个表中的日期范围和第二个表中的日期

如何将 SQL 中的 2 个表与 1 个公共列组合在一起,而其他列中没有关系?

更好的方法来选择第一个表中的所有列,并且只选择第二个表中的一列。

Oracle - 使用第二个表中的行更新第一个表中的数据

如果一个表的列等于第二个表中的列,则在第三个表中插入值,python - mysql

使用 SSIS 将单个字段值拆分为第二个表中的多行