多次加入smae表的SQL查询

问题描述 投票:0回答:1

我有一个方案,要多次连接同一张表,以获得所需的输出。例如,我有两个表TABLE A和TABLE B。

enter image description here

enter image description here

  • 步骤1:我想从TABLE A中取出所有的当事人,其中有最低的Idate。根据partyid和idatecolumn来获取最低的Idate。
  • 步骤2:然后根据步骤1中从TABLE A中获取的CID,我们需要从TABLE B中获取相应的MID,MIDTYPE=130300。
  • 步骤3:然后根据步骤2中获取的MID,我们需要遍历同一张表,根据TABLE B中的idate,找出同一MID的最新记录,并获取该MID对应的CID。
  • 第四步:现在对于该CID,我们需要在同一张表(TABLEB)中获取MIDTYPE130307的MID值。而我的最终输出应该是我们在第3步中获取的MID值和第4步中为130307获取的MID值的组合。

我写了一个这样的查询,但是由于我们要多次浏览同一个表(TABLEB),而且TABLEB有几百万行,所以查询的运行需要很多时间。有什么办法可以让我们以不同的方式重写这个查询。Could some one can help with this me.

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

enter image description here

sql db2
1个回答
0
投票

不是你所问的,但在别人和我,花时间为你争取不同的方法之前,让我们确保基本的东西都被覆盖。

无论你能写出多么不同的SQL查询,如果你没有合适的索引,它们永远不会快速执行,在一个MILLION基表中。 特别是你的情况,因为你至少要访问它3次。

只是通过看你的详细步骤。我想说的是,你应该至少创建3个不同的索引来支持这个查询。

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

你有这些索引吗?你有没有试过在 db2-advisor (db2advis) 上运行这个查询,以获得推荐的索引?

© www.soinside.com 2019 - 2024. All rights reserved.