我得到一个查询,我试图从另一个表中获取max(date)值作为连接条件。
SELECT a.col1, a.col2
FROM tablea a,
tableb b
WHERE a.pk_id = b.fk_id
AND a.effdt = (SELECT MAX(effdt)
FROM tablea c
where c.id= a.id
and c.effdt <= sysdate
)
此处已在tablea上为effdt列创建索引,但查询仍需要很长时间才能返回值。任何更好地加入他们的帮助都会很棒。
答案 0 :(得分:1)
使用RANK()
分析函数消除相关的子查询:
SELECT *
FROM (
SELECT a.*,
RANK() OVER ( PARTITION BY a.id ORDER BY a.effdt DESC ) AS rnk
FROM tablea a
INNER JOIN
tableb b
ON ( a.pk_id = b.fk_id )
WHERE a.effdt <= SYSDATE
)
WHERE rnk = 1;
答案 1 :(得分:0)
表c上的子查询,effdt
上的索引是不够的。
(id, effdt)
上的索引会做得更好。关键是在单个索引中覆盖where
子句以及max(effdt)
函数。这与索引order by
:http://use-the-index-luke.com/de/sql/sortieren-gruppieren/indexed-order-by
答案 2 :(得分:0)
除了添加Markus建议的index
之外,请尝试此操作。
IMO加入的工作比子查询更好(对于我尝试过的场景)
SELECT a.*
FROM tablea a
INNER JOIN tableb b
ON a.pk_id = b.fk_id
INNER JOIN
(SELECT MAX(effdt) AS effdt
FROM tablea
WHERE effdt <= sysdate
) c ON c.id = a.id
AND c.effdt = a.effdb