sql查询多次连接smae表

r3i60tvu  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(308)

我有一个场景,可以多次连接同一个表以获得所需的输出。例如,我有两张表,表a和表b。


第1步:我想从表a中选出idate最低的所有参与者。最低的idate将基于partyid和idate列获取。
步骤2:然后根据步骤1中从表a中获取的cid,我们需要从表b中获取对应的mid,midtype=130300。
第3步:然后根据第2步中获取的mid,我们需要遍历同一个表,根据表b中的idate找出同一mid的最新记录,并获取mid对应的cid。
步骤4:现在对于那个cid,我们需要在同一个表(tableb)中获取midtype 130307的中间值。我的最终输出应该是mid的组合,我们在步骤3中获取了mid,在步骤4中获取了130307。
我写了一个这样的查询..但是运行查询要花很多时间,因为我们要多次遍历同一个表(tableb),tableb有数百万行。不管怎样,我们可以用不同的方式重写这个查询。谁能帮我一下吗。

SELECT
    ident.mid mid1,
    b.mid mid2
FROM
    (
        SELECT
            *
        FROM
            tableb
        WHERE
            midtype = 130307
    ) ident
    INNER JOIN (
        SELECT
            s.cid,
            s.mid,
            s.midtype
        FROM
            (
                SELECT
                    cid,
                    partyid,
                    admin_sys_tp_cd,
                    mid,
                    ilast
                FROM
                    (
                        SELECT
                            cq.cid,
                            RANK() OVER(
                                PARTITION BY cq.partyid
                                ORDER BY
                                    cq.idate ASC
                            ) rnk,
                            cq.idate,
                            cq.partyid,
                            i.mid,
                            i.idate AS ilast
                        FROM
                            tablea cq
                            INNER JOIN tableb i ON cq.cid = i.cid
                            INNER JOIN tablec ON i.cid = c.cid
                        WHERE
                            i.midtype = 130300
                    )
                WHERE
                    rnk = 1
            ) a
            INNER JOIN (
                SELECT
                    *
                FROM
                    (
                        SELECT
                            cid,
                            mid,
                            midtype,
                            RANK() OVER(
                                PARTITION BY mid
                                ORDER BY
                                    idate DESC
                            ) rnk_mpid
                        FROM
                            tableb
                    )
                WHERE
                    rnk_mpid = 1
            ) s ON a.mid = s.mid
                   AND s.midtype = 130300
    ) b ON ident.cid = b.cid
           AND ident.midtype = 130307

b4lqfgs4

b4lqfgs41#

不是你要求的,而是在其他人和我花时间尝试为你提供不同的方法之前,让我们确保涵盖了基本知识。
不管编写一个sql查询的方式有多不同,如果没有合适的索引,它们的执行速度永远不会很快,在一个百万基表中。特别是在您的情况下,因为您必须访问它至少3次。
只要看看你的详细步骤。我认为您应该至少创建3个不同的索引来支持这个查询。

TableA_Index1 ( PARTYID, LDATE,  INCLUDES CID) 
TableB_Index1 (CID, MIDTYPE, INCLUDES MID ) 
TableB_Index2 (MID, LDATE, INCLUDES CID )

有吗?您是否曾尝试在db2advisor(db2advis)上运行此查询以获取建议的索引?

相关问题