Sql 历史性的约会
我有以下代码从两个表中获取所有历史数据, 这部分代码出现在我的查询中,这个查询相当大,即使我在其中有索引,这部分代码的执行也需要相当长的时间Sql 历史性的约会,sql,Sql,我有以下代码从两个表中获取所有历史数据, 这部分代码出现在我的查询中,这个查询相当大,即使我在其中有索引,这部分代码的执行也需要相当长的时间 select B.PER,MAX(B.BGDT,C.BGDT) AS BGDT , MIN(B.ENDT,C.ENDT) AS ENDT,B.BGDT as begb,C.BGDT as begc,B.ENDT as endb,C.ENDT as endc from PERDET B, PER C where ( C.BGD
select B.PER,MAX(B.BGDT,C.BGDT) AS BGDT
, MIN(B.ENDT,C.ENDT) AS ENDT,B.BGDT as begb,C.BGDT as begc,B.ENDT as endb,C.ENDT as endc from PERDET B, PER C where ( C.BGDT >= B.BGDT
AND C.BGDT <= B.ENDT
)
OR
(
B.BGDT >= C.BGDT
AND B.BGDT <= C.ENDT
)
选择B.PER,MAX(B.BGDT,C.BGDT)作为BGDT
,最小值(B.ENDT,C.ENDT)为ENDT,B.BGDT为begb,C.BGDT为begc,B.ENDT为endb,C.ENDT为endc,根据C,其中(C.BGDT>=B.BGDT
和C.BGDT=C.BGDT
B.BGDT试试这个:-
SELECT B.PER, MAX(B.EFCV_BGDT,C.EFCV_BGDT) AS EFCV_BGDT,
MIN(B.EFCV_ENDT,C.EFCV_ENDT) AS EFCV_ENDT, B.EFCV_BGDT as begb,
C.EFCV_BGDT as begc,B.EFCV_ENDT as endb, C.EFCV_ENDT as endc
FROM PERDET B, PER C
WHERE ( C.EFCV_BGDT >= B.EFCV_BGDT
OR C.EFCV_BGDT <= B.EFCV_ENDT
)
AND
(
B.EFCV_BGDT >= C.EFCV_BGDT
OR B.EFCV_BGDT <= C.EFCV_ENDT
)
选择B.PER,MAX(B.EFCV_BGDT,C.EFCV_BGDT)作为EFCV_BGDT,
最小值(B.EFCV_ENDT,C.EFCV_ENDT)作为EFCV_ENDT,B.EFCV_BGDT作为begb,
C.EFCV_BGDT作为begc,B.EFCV_ENDT作为endb,C.EFCV_ENDT作为endc
从B区到C区
其中(C.EFCV_BGDT>=B.EFCV_BGDT
或C.EFCV_BGDT=C.EFCV_BGDT
或者B.EFCV_BGDT=C.EFCV_BGDT和B.EFCV_BGDTPER和PERDET是否具有链接两个表的公共ID?
如果没有前100行左右的一些示例数据的屏幕截图,我无法判断这些表是如何关联的,但是如果有一个公共ID(我将用作cid),您可以尝试以下方法:
SELECT B.PER,MAX(B.EFCV_BGDT,C.EFCV_BGDT) AS EFCV_BGDT
, MIN(B.EFCV_ENDT,C.EFCV_ENDT) AS EFCV_ENDT
,B.EFCV_BGDT as begb
,C.EFCV_BGDT as begc
,B.EFCV_ENDT as endb
,C.EFCV_ENDT as endc
FROM PERDET B
INNER JOIN PER C ON B.cid = C.cid
WHERE ( C.EFCV_BGDT BETWEEN B.EFCV_BGDT
AND B.EFCV_ENDT
)
OR
(
B.EFCV_BGDT BETWEEN C.EFCV_BGDT
AND C.EFCV_ENDT
)
我不知道这是否会加快你的速度。我不明白你说我来试试Ankit的意思@user3248637说的是“检查你的逻辑。”“a>=b和a@Rafs的意思是,您仅基于日期字段连接两个表中的每一行。几乎可以肯定,还有一些其他条件将一个表中的一行与另一个表中的匹配行相关联。请先连接该条件,然后连接日期之间的关系(一旦您弄清楚了可能的关系)。我唯一的建议是在id和日期上加入,而不是在id上加入所有行,然后根据日期进行筛选。
SELECT B.PER,MAX(B.EFCV_BGDT,C.EFCV_BGDT) AS EFCV_BGDT
, MIN(B.EFCV_ENDT,C.EFCV_ENDT) AS EFCV_ENDT
,B.EFCV_BGDT as begb
,C.EFCV_BGDT as begc
,B.EFCV_ENDT as endb
,C.EFCV_ENDT as endc
FROM PERDET B
INNER JOIN PER C ON B.cid = C.cid
WHERE ( C.EFCV_BGDT BETWEEN B.EFCV_BGDT
AND B.EFCV_ENDT
)
OR
(
B.EFCV_BGDT BETWEEN C.EFCV_BGDT
AND C.EFCV_ENDT
)