sql - 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";
我遇到的问题是,这运行起来非常缓慢,因为实际上我有一个更大的数据集。有没有更有效的方法来做到这一点,我错过了?
谢谢!
解决方案
不确定这是否会有所帮助,但是每当您同时使用两个表中的元素同时使用带有条件的 aCROSS JOIN
和 aWHERE
子句时,您都可以将其重写为使用 an INNER JOIN
......有时数据库可以推断出更好的执行计划。
同样,我无法预测这是否会对您的情况有所帮助,但是当它确实有帮助时,改进通常集中在更好地利用索引上,其中CROSS JOIN
忽略了一个有用的索引来过滤结果,而是选择了一个更好的索引来排序结果,或涵盖所有使用的字段,因为假设将使用表中的每条记录。
说到索引,如果这没有帮助,那就是接下来要看的事情。但是由于我们不知道您已经拥有哪些索引,所以我在这里提出的任何建议都是在黑暗中进行的。
推荐阅读
- flutter - Flutter:'Future.wait' 并行的多个异步函数 VS 'await' 一次一个。<= 不同的结果
- javascript - 将 js 数组发布到 PHP 并在数据库查询中使用它
- python - 从 boto3 客户端获取重试次数
- outlook - 无法取消 ical 事件(可怕的“不支持的日历 message.ics”)
- r - 如何在我的 ODBC 连接对象中引用表名?
- algorithm - 求解决paint-tool-puzzle的案例数
- r - R:如何将列中的值转换为行数?
- sql - Redshift - 如何合并并沿行维度添加?
- r - 查找满足定义条件的第一个值
- wpf - 在 CellEditingTemplate 上的 DataGrid 中的自定义 TextBox 控件上的 SelectAll 文本