根据日期和最小条件连接表
Join tables based on date and min condition
我有 2 个 table,其中一个 包含与其他列一起的单个日期列,第二个 table 包含开始日期、结束日期和外键列。
table一个
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 | ... | ... | ...
tableb
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 | ... | ... | ...
table a
包含大约 +150 000 个条目 table b
大约 +6000
我想查询table a
的ID
和table 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
子句提供索引。
我有 2 个 table,其中一个 包含与其他列一起的单个日期列,第二个 table 包含开始日期、结束日期和外键列。
table一个
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 | ... | ... | ...
tableb
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 | ... | ... | ...
table a
包含大约 +150 000 个条目 table b
大约 +6000
我想查询table a
的ID
和table 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
子句提供索引。