Select - nur eine von meheren Fremdschlüssel Beziehungen

Ich habe eine Tabelle A und eine Tabelle B.
B enthält einen Fremdschlüssel auf die Tabelle A.

Zwischen A und B existiert also eine 1:M Beziehung, mehrere Einträge aus B zeigen auf den gleichen Record in A.

Frage: Ich möchte ein select statemenet bauen wo ich jeden Record aus A berücksichtige, aber ich brauch nicht jeden Record aus B, ich brauch genau einen Record aus B, egal welcher.

Beispiel :

Tabelle A
ID, Name

Tabelle B
ID, Zahl, A_ID(Fremdschlüssel auf ID von Tabelle A)

Es gibt 10 Records aus Tabelle B die auf A zeigen. Ich benötige aber nur einen Record aus B, irgend einen, egal welcher.

Wie mach ich das ?

Ich würde es mit CTE machen.

with data as (
    select  a.id, a.name, b.id as b_id, b.zahl
           , row_number() over (partition by a.id order by a.id) as row_number
        from a
            join b
                on b.a_id = a.id
)
select d.*
    from data d
    where d.row_number = 1
;

Gruß frastr

test=*# select * from a;
 id 
----
  1
  2
  3
(3 rows)

test=*# select * from b;
 a_id | val 
------+-----
    1 |   1
    1 |   3
    1 |   5
    2 |   9
    2 |   6
    2 |   4
    3 |   3
    3 |   3
    3 |   3
(9 rows)

test=*# select * from a left join (select a_id, min(val) from b group by a_id) x on a.id=x.a_id;
 id | a_id | min 
----+------+-----
  1 |    1 |   1
  2 |    2 |   4
  3 |    3 |   3
(3 rows)

CTE haben ihre Nachteile (Performance)…

Eine weitere Methode wäre ein lateral join mit limit:

select *
from a 
  join lateral (
    select *
    from b
    where where b.a_id = a.id
    limit 1
  ) b2 on true