首页 > 解决方案 > Oracle SQL 中的日期和交叉联接

问题描述

我正在使用 Oracle SQL,但在使用交叉连接时遇到了问题。我有一个表 SERVICES,其中包含服务的开始日期和结束日期:

SRVC         START          END
Therapy      JAN-1-20       JAN-5-20
Baseball     FEB-15-20      FEB-18-20

我需要将此表转换为以下内容:

SRVC         DATE
Therapy      JAN-1-20
Therapy      JAN-2-20
...
Therapy      JAN-5-20
Baseball     FEB-15-20
Baseball     FEB-16-20
...
Baseball     FEB-18-20

本质上,我每天需要一行,而不是日期范围。我目前的做法如下。我有另一个表 DATE_TIME,带有日期,例如

CALDR_DT
JAN-1-20
...
DEC-31-20

我正在做以下事情

SELECT s."SRVC", d."CALDR_DT"
FROM SERVICES s
CROSS JOIN DATE_TIME d
WHERE d."CALDR_DT" >= s."START" AND d."CALDR_DT" <= s."END";

我遇到的问题是,这运行起来非常缓慢,因为实际上我有一个更大的数据集。有没有更有效的方法来做到这一点,我错过了?

谢谢!

标签: sqloracle

解决方案


不确定这是否会有所帮助,但是每当您同时使用两个表中的元素同时使用带有条件的 aCROSS JOIN和 aWHERE子句时,您都可以将其重写为使用 an INNER JOIN......有时数据库可以推断出更好的执行计划。

同样,我无法预测这是否会对您的情况有所帮助,但是当它确实有帮助时,改进通常集中在更好地利用索引上,其中CROSS JOIN忽略了一个有用的索引来过滤结果,而是选择了一个更好的索引来排序结果,或涵盖所有使用的字段,因为假设将使用表中的每条记录。

说到索引,如果这没有帮助,那就是接下来要看的事情。但是由于我们不知道您已经拥有哪些索引,所以我在这里提出的任何建议都是在黑暗中进行的。


推荐阅读