Sql 基于日期和最小条件联接表
我有两个表,其中一个表包含一个日期列以及其他列,第二个表包含startdate、enddate和外键列 表aSql 基于日期和最小条件联接表,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
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
子句提供索引