使用左连接查找最接近值的有效方法

The efficient way to use left join to find the closest value

我需要找到右边最接近的值 table 并将它们全部合并。 但是为了做我的左连接查询在所有排列上运行并且它需要大量资源来计算(我的基本 tables 很大)

For example my A table looks like 
<A,1>
<A,2>
<A,10>

And table B looks like : 

<A,4>
<A,5>
<A,6>
<A,7>

For this example the result will be: 

<A,1,4>
<A,2,4>
<A,10,7>

我是这样想的:

select * from (
select *,row_number() over(partition by rown order by abs(b-a) asc)  diff  from (
(select a,b, row_number over () rown from x) a
CROSS JOIN
(select a,b from x) b
on a.a = b.a

) )where diff =1

有没有更好更有效的方法?

考虑下面的例子

select id, a.val a_val, b.val b_val
from tableA a
left join tableB b
using(id)
where true 
qualify row_number() over(partition by id, a.val order by abs(a.val - b.val)) = 1

如果应用于您问题中的示例数据 - 输出为