繁体   English   中英

SQL查询多次加入smae表

[英]SQL query to join smae table multiple times

我有一个场景要多次加入同一个表以获得所需的 output。 例如,我有两个表 TABLE A 和 TABLE B。

在此处输入图像描述

在此处输入图像描述

  • 第 1 步:我想从表 A 中取出 Idate 最低的所有各方。 将根据partyid 和idate 列获取最低的idate。
  • 步骤2:然后根据步骤1中从表A中获取的CID,我们需要从表B中获取对应的MID,其中MIDTYPE=130300。
  • 第三步:然后根据第二步获取的MID,我们需要遍历同一张表,根据TABLE B中的idate找出同一个MID的最新记录,并获取该MID对应的CID。
  • 第 4 步:现在对于该 CID,我们需要在同一个表 (TABLEB) 中获取 MIDTYPE 130307 的 MID 值。 我最终的 output 应该是我们为步骤 3 获取的 MID 和在步骤 4 中获取的 130307 的 MID 的组合。

我写了一个这样的查询..但是查询运行需要花费很多时间,因为我们多次通过同一个表(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

在此处输入图像描述

不是你问的,而是在我和其他人花时间尝试为你找到不同的方法之前,让我们确保涵盖了基础知识。

无论您编写 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) 上运行此查询以获取推荐的索引?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM