的PostgreSQL有这种类型的查询非常漂亮的语法 - distinct on:
SELECT DISTINCT ON(表达式[,...])只保留的 第一行各自组行的地方给定的表达式评估为相等。使用与 ORDER BY(见上)相同的规则解释DISTINCT ON表达式。请注意,除非使用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