Versuchen Sie:
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
Geige:http://sqlfiddle.com/#!15/ab5ae/5/0
Obwohl es nicht mit Ihrer erwarteten Ausgabe übereinstimmt, denke ich, dass die Ausgabe basierend auf Ihrer Beschreibung korrekt ist, da Sie sehen können, dass jedes Paar einen Unterschied mit einem absoluten Wert von 1 aufweist.
Bearbeiten - Versuchen Sie Folgendes, basierend auf der Reihenfolge von a bis 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
Geige:http://sqlfiddle.com/#!15/ab5ae/19/0