PostgreSQL hat sehr schöne Syntax für diese Art von Anfragen - distinct on:
DISTINCT ON SELECT (expression [, ...]) hält nur die erste Zeile von jeden Satz von Zeilen, in denen Die angegebenen Ausdrücke werden als gleichwertig bewertet. Die DISTINCT ON-Ausdrücke werden mit den gleichen Regeln interpretiert wie für ORDER BY (siehe oben). Beachten Sie, dass die "erste Zeile" jedes Satzes unvorhersehbar ist, es sei denn, ORDER BY wird verwendet, um sicherzustellen, dass die gewünschte Zeile zuerst angezeigt wird.
So Ihre Anfrage wird:
select distinct on(g.geo_id)
g.geo_id, gs.shape_type
from schema.geo g
join schema.geo_shape gs on (g.geo_id=gs.geo_id)
order by g.geo_id, gs.shape_type asc;
Im Allgemeinen ANSI-SQL-Syntax für diesen (in jedem RDBMS mit Fensterfunktionen und allgemeinem Tabellenausdruck, die Unterabfrage eingeschaltet werden könnte) wäre:
with cte as (
select
row_number() over(partition by g.geo_id order by gs.shape_type) as rn,
g.geo_id, gs.shape_type
from schema.geo g
join schema.geo_shape gs on (g.geo_id=gs.geo_id)
)
select
geo_id, shape_type
from cte
where rn = 1