Zkuste:
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
housle:http://sqlfiddle.com/#!15/ab5ae/5/0
Ačkoli to neodpovídá vašemu očekávanému výstupu, myslím si, že výstup je správný na základě toho, co jste popsali, jak vidíte, každý pár má rozdíl s absolutní hodnotou 1.
Upravit – Vyzkoušejte následující v pořadí 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
Housle:http://sqlfiddle.com/#!15/ab5ae/19/0