2013-09-24 9 views

Antwort

20

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 
Verwandte Themen