PostgreSQLには、このタイプのクエリに対して非常に優れた構文があります。
SELECT DISTINCT ON ( expression [, ...] ) は、指定された式が等しいと評価される行の各セットの最初の行のみを保持します。DISTINCT ON 式は、ORDER BY と同じ規則を使用して解釈されます (上記を参照)。ORDER BY を使用して目的の行が最初に表示されるようにしない限り、各セットの「最初の行」は予測できないことに注意してください。
したがって、クエリは次のようになります。
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;
これに対する一般的な ANSI-SQL 構文 (サブクエリに切り替えることができる、ウィンドウ関数と共通テーブル式を持つ RDBMS の場合) は次のようになります。
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