Sql 基于日期和最小条件联接表

Sql 基于日期和最小条件联接表,sql,oracle,date,join,between,Sql,Oracle,Date,Join,Between,我有两个表,其中一个表包含一个日期列以及其他列,第二个表包含startdate、enddate和外键列 表a ID | DATE | COL1 | COL2 1 | 12.01.2018 | X | Y 2 | 12.02.2018 | Z | Y 3 | 12.03.2018 | Y | A 4 | 12.04.2018 | B | A n | ... | ... | ... 表b ID | startDATE | endDat

我有两个表,其中一个表包含一个日期列以及其他列,第二个表包含startdate、enddate和外键列

表a

ID | DATE       | COL1 | COL2
1  | 12.01.2018 | X    | Y
2  | 12.02.2018 | Z    | Y
3  | 12.03.2018 | Y    | A
4  | 12.04.2018 | B    | A
n  | ...        | ...  | ...
表b

ID | startDATE  | endDate    | fID
1  | 01.01.2018 | 31.01.2018 | 1
2  | 04.01.2018 | 15.01.2018 | 2
3  | 01.02.2018 | 28.02.2018 | 1
4  | 01.04.2018 | 30.04.2018 | 1
5  | 13.04.2018 | 20.04.2018 | 2
n  | ...        | ...        | ...
表a
包含大约+150000个条目
表b
大约+6000个条目

我想查询
表a
ID
,如果存在
表b
fID
的最小值

到目前为止,我得到的是

SELECT
     a.ID
    ,nvl(min(b.fID),3)
FROM
    a
    LEFT JOIN b ON a.date between b.startDate AND b.endDate  
GROUP BY 
    a.ID

这和预期的一样,但性能很差,需要大约45秒才能解析查询。有什么办法可以提高这一点吗?在第二个select值上更改
group by
partition by
会导致相同的长度。

使用相关子查询可能会更快:

SELECT a.ID,
       (SELECT COALESCE(MIN(b.fid), 3)
        FROM b
        WHERE a.date between b.startDate AND b.endDate
       )
FROM a;

挑战在于很难为
WHERE
子句提供索引

使用相关子查询可能会更快:

SELECT a.ID,
       (SELECT COALESCE(MIN(b.fid), 3)
        FROM b
        WHERE a.date between b.startDate AND b.endDate
       )
FROM a;
挑战在于很难为
WHERE
子句提供索引