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 个公共列组合在一起,而其他列中没有关系?
更好的方法来选择第一个表中的所有列,并且只选择第二个表中的一列。