【问题标题】:Join tables based on date and min condition根据日期和最小条件连接表
【发布时间】:2020-04-05 22:36:41
【问题描述】:

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

表一

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

table a 包含大约 +150 000 个条目 table b 大约 +6000

我想查询table aIDtable bfID的最小值(如果存在)。

我目前拥有的是

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 秒才能解决。有什么办法可以提升这个吗?在第二个选择值上将 group by 更改为 partition by 会产生相同的长度。

【问题讨论】:

    标签: sql oracle date join between


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-17
      • 1970-01-01
      相关资源
      最近更新 更多