【发布时间】:2019-09-11 12:32:46
【问题描述】:
我需要查看我们数据库中的一个实物,它可以是我的小型建筑公司处理的任何类型的交易。然后,根据交易类型,确定到期日期和承诺日期。有十五种不同的交易类型,但我主要关注四五种:
SELECT
datatable.ID_Number,
datatable.Object_Type,
CASE
WHEN Object_Type = 'AA' THEN (SELECT PO_DUE_DATE FROM tblPO WHERE datatable.ID_Number = tblPO.PO_ID)
WHEN Object_Type = 'AB' THEN (SELECT PROD_DUE_DATE FROM tblPROD WHERE datatable.ID_Number = tblPROD.PROD_ID)
WHEN Object_Type = 'AC' THEN (SELECT PLAN_DUE_DATE FROM tblPLAN WHERE datatable.ID_Number = tblPLAN.PLAN_ID)
WHEN Object_Type = 'BN' THEN (SELECT NEED_DUE_DATE FROM tblPURCHASE WHERE datatable.ID_Number = tblPURCHASE.PURCHASE_ID)
ELSE TO_DATE(NULL) END AS Object_Due_Date,
CASE
WHEN Object_Type = 'AA' THEN (SELECT PO_PROM_DATE FROM tblPO WHERE datatable.ID_Number = tblPO.PO_ID)
WHEN Object_Type = 'AB' THEN (SELECT PROD_PROM_DATE FROM tblPROD WHERE datatable.ID_Number = tblPROD.PROD_ID)
WHEN Object_Type = 'AC' THEN (SELECT PLAN_PROM_DATE FROM tblPLAN WHERE datatable.ID_Number = tblPLAN.PLAN_ID)
WHEN Object_Type = 'BN' THEN (SELECT NEED_PROM_DATE FROM tblPURCHASE WHERE datatable.ID_Number = tblPURCHASE.PURCHASE_ID)
ELSE TO_DATE(NULL) END AS Object_Promised_Date
FROM
datatable
WHERE
( other filtering criteria )
这给了我这样的输出:
| ID_Number | Object_Type | Object_Due_Date | Object_Promised_Date |
|:---------:|:-----------:|:---------------:|:--------------------:|
| 1 | AA | 11/26/2018 | 10/18/2018 |
| 2 | AB | 5/12/2018 | 3/31/2018 |
| 3 | AA | 6/15/2018 | 9/18/2018 |
| 4 | AA | 1/24/2018 | 10/2/2018 |
| 5 | ZZ | 10/27/2018 | 6/11/2018 |
| 7 | BN | 1/23/2018 | 7/2/2018 |
| 8 | AC | 4/3/2018 | 8/3/2018 |
| 9 | BN | 12/1/2018 | 8/16/2018 |
| 10 | BN | 1/10/2018 | 10/6/2018 |
而且效果很好!问题是datatable 大约有 2000 万条记录,而且这些日期可能会发生变化,因此我需要每隔一段时间(每周一次或两次)刷新报告。运行和更新需要 8-9 小时,因为对于每条记录,我都会有条件地加入另一个表。
如何提高此查询的运行时效率?我知道我可以离开表格加入,但我不知道如何用日期填充单个列值,具体取决于Object_Type,而不是为Type_AA_Due_DateType_AB_ Due_Date 等设置 n 列。
【问题讨论】:
标签: sql oracle performance