相关子查询, 没有索引, 将进行交叉连接 。 因此, 表达查询的另一种方式是 :
select rp.*, min(abs(rp.t - rq.t))
from rp cross join
rq
group by <rp.*> -- <== need to replace with all columns
还有另一种方法,它比较复杂。这需要使用累积总和。
这里就是这个想法。 将所有 rp 和 rq 值合并在一起。 现在, 用最接近 rp 值来列出它们。 也就是说, 为 rp 创建一个 rp 标记, 并计算累积总和。 因此, 两个 rq 值之间的所有rq 值都具有相同的rp 指数 。
最接近给定的 rq 值的值有一个与rq 值或一个以上相同的 rp 指数。计算 rq_ index 时使用累积总和。
以下查询将这一点组合在一起:
with rqi as (select t.*, sum(isRQ) over (order by t) as rq_index
from (select rq.t, 0 as isRP, <NULL for each rp column>
from rq
union all
select rq.t, 1 as isRP, rp.*
from rp
) t
) t
select rp.*,
(case when abs(rqprev.t - rp.t) < abs(rqnext.t - rp.t)
then abs(rqprev.t - rp.t)
else abs(rqnext.t - rp.t)
end) as closest_value
from (select *
from t
where isRP = 0
) rp join
(select *
from t
where isRP = 1
) rqprev
on rp.rp_index = rqprev.rp_index join
(select *
from t
where isRP = 1
) rqnext
on rp.rp_index+1 = rpnext.rq_index
这种办法的优点是,没有交叉加入,也没有相关的子节。