2010-06-18 7 views
0

J'ai une table avec la structure suivante:SQL pour sélectionner uniquement le dernier élément d'une table versionnée

CREATE TABLE items (
    id serial not null, 
    title character varying(255), 
    version_id integer DEFAULT 1, 
    parent_id integer, 
    CONSTRAINT items_pkey PRIMARY KEY (id) 
) 

Ainsi, la table contient des lignes qui se présente comme ceci:

id: 1, titre: "Version 1", id_version: 1, parent_id: 1
id: 2, titre: "Version 2", id_version: 2, parent_id: 1
id: 3, titre: "Enregistrement complètement différent", id_version: 1, parent_id: 3

Voici le code SQL que j'ai pour sélectionner sur tous les enregistrements avec version la plus récente ids:

select * from items 
inner join (
    select parent_id, max(version_id) as version_id from items 
    group by parent_id) as vi 
on items.version_id = vi.version_id and items.parent_id = vi.parent_id 

Est-il possible d'écrire cette instruction SQL afin qu'il n'utilise pas subselect?

+2

Peut-être que je ne comprends pas bien mais que vous cherchez 'distinct on'? http://www.postgresql.org/docs/8.4/interactive/queries-select-lists.html#QUERIES-DISTINCT – Wolph

Répondre

2
SELECT distinct on (parent_id) 
    parent_id 
    , version_id 
FROM items 
ORDER BY parent_id, version_id DESC 
Questions connexes