Oracle SQL-基于逻辑实现一对多的一对一连接
对不起,我的标题太宽泛了,我很难用一种简单的方式来描述我想做的事情。我有两个表(下面的例子),我想加入,但在一定条件下 主表有一个名为“DateVal”的字段,第二个表有一个名为“Day”的字段。在加入字段“JoinField”后,我只想保留“DateVal”中的day值小于“day”值的行。但是,如果多个“Day”值满足此条件,我只希望它保留第一个实例 在下面的第二个表中,对于JoinField“A”,有三行,第一行我只希望它在月日介于1-10之间时返回时间,第二行仅在月日介于11-20之间时返回时间,最后一行返回时间为20-31 左连接或内连接将返回所有值,我唯一能想到的解决方法是执行完整连接并只返回min(“Day”)。有人能想出一个更有效的方法吗 提前谢谢 表1Oracle SQL-基于逻辑实现一对多的一对一连接,sql,oracle,join,Sql,Oracle,Join,对不起,我的标题太宽泛了,我很难用一种简单的方式来描述我想做的事情。我有两个表(下面的例子),我想加入,但在一定条件下 主表有一个名为“DateVal”的字段,第二个表有一个名为“Day”的字段。在加入字段“JoinField”后,我只想保留“DateVal”中的day值小于“day”值的行。但是,如果多个“Day”值满足此条件,我只希望它保留第一个实例 在下面的第二个表中,对于JoinField“A”,有三行,第一行我只希望它在月日介于1-10之间时返回时间,第二行仅在月日介于11-20之间时
-------------------------------
| ID | JoinField | DateVal |
-------------------------------
| 1 | A | 01/01/2014 |
| 2 | A | 01/16/2014 |
| 3 | B | 05/20/2013 |
-------------------------------
表2
--------------------------------
| JoinField | Day | FieldToAdd |
--------------------------------
| A | 10 | A |
| A | 20 | AA |
| A | 31 | AAA |
| B | 15 | B |
| B | 31 | BB |
--------------------------------
预期结果
--------------------------------------------
| ID | JoinField | DateVal | FieldToAdd |
--------------------------------------------
| 1 | A | 01/01/2014 | A |
| 2 | A | 01/16/2014 | AA |
| 3 | B | 05/20/2014 | BB |
--------------------------------------------
你可以用多种方式来做这件事。我认为关联子查询是表达它的最简单方式,但不幸的是,以下内容在Oracle中不起作用:
select t1.*,
(select *
from (select t2.*
from table2 t2
where t2.day < extract(day from t1.dateval)
order by t2.day desc
) t
where rownum = 1
)
from table1 t1;
除了将Min(DateVal)作为列之外,是否像普通连接一样进行连接由于t1.DateVal不在子查询的这一部分中,因此您可以在使用它的地方使用它吗?@user1723699。我一直怀疑Oracle不允许关联超过一个级别。我用另一种方法编辑了答案。谢谢,这太棒了!
select *
from (select t1.*,
row_number() over (partition by t1.id order by t2.day desc) as seqnum
from table1 t1 left outer join
table2 t2
on t2.day < extract(day from t1.dateval)
) t
where seqnum = 1;