Wypróbuj:
select a.id, a.x as ax, b.x as bx, x.min_abs_diff
from table_a a
join table_b b
on a.id = b.id
join (select a.id, min(abs(a.x - b.x)) as min_abs_diff
from table_a a
join table_b b
on a.id = b.id
group by a.id) x
on x.id = a.id
and abs(a.x - b.x) = x.min_abs_diff
skrzypce:http://sqlfiddle.com/#!15/ab5ae/5/0
Chociaż nie pasuje do oczekiwanego wyniku, myślę, że wynik jest prawidłowy w oparciu o to, co opisałeś, ponieważ każda para ma różnicę z wartością bezwzględną 1.
Edytuj — wypróbuj następujące rozwiązania, w kolejności od a do b:
select *
from (select a.id,
a.x as ax,
b.x as bx,
x.min_abs_diff,
row_number() over(partition by a.id, b.x order by a.id, a.x) as rn
from table_a a
join table_b b
on a.id = b.id
join (select a.id, min(abs(a.x - b.x)) as min_abs_diff
from table_a a
join table_b b
on a.id = b.id
group by a.id) x
on x.id = a.id
and abs(a.x - b.x) = x.min_abs_diff) x
where x.rn = 1
Skrzypce:http://sqlfiddle.com/#!15/ab5ae/19/0