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
    )