Oracle SQL-基于逻辑实现一对多的一对一连接

Oracle SQL-基于逻辑实现一对多的一对一连接,sql,oracle,join,Sql,Oracle,Join,对不起,我的标题太宽泛了,我很难用一种简单的方式来描述我想做的事情。我有两个表(下面的例子),我想加入,但在一定条件下 主表有一个名为“DateVal”的字段,第二个表有一个名为“Day”的字段。在加入字段“JoinField”后,我只想保留“DateVal”中的day值小于“day”值的行。但是,如果多个“Day”值满足此条件,我只希望它保留第一个实例 在下面的第二个表中,对于JoinField“A”,有三行,第一行我只希望它在月日介于1-10之间时返回时间,第二行仅在月日介于11-20之间时

对不起,我的标题太宽泛了,我很难用一种简单的方式来描述我想做的事情。我有两个表(下面的例子),我想加入,但在一定条件下

主表有一个名为“DateVal”的字段,第二个表有一个名为“Day”的字段。在加入字段“JoinField”后,我只想保留“DateVal”中的day值小于“day”值的行。但是,如果多个“Day”值满足此条件,我只希望它保留第一个实例

在下面的第二个表中,对于JoinField“A”,有三行,第一行我只希望它在月日介于1-10之间时返回时间,第二行仅在月日介于11-20之间时返回时间,最后一行返回时间为20-31

左连接或内连接将返回所有值,我唯一能想到的解决方法是执行完整连接并只返回min(“Day”)。有人能想出一个更有效的方法吗

提前谢谢

表1

-------------------------------
| 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;