我有一个场景,可以多次连接同一个表以获得所需的输出。例如,我有两张表,表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
1条答案
按热度按时间b4lqfgs41#
不是你要求的,而是在其他人和我花时间尝试为你提供不同的方法之前,让我们确保涵盖了基本知识。
不管编写一个sql查询的方式有多不同,如果没有合适的索引,它们的执行速度永远不会很快,在一个百万基表中。特别是在您的情况下,因为您必须访问它至少3次。
只要看看你的详细步骤。我认为您应该至少创建3个不同的索引来支持这个查询。
有吗?您是否曾尝试在db2advisor(db2advis)上运行此查询以获取建议的索引?