2016-05-24 1 views
0

J'ai deux tables DB dans la base de données PostgresSQL:table réelle/historique: sélectionnez par numéro de version

create table actual (id int, name text, version int) 
create table history (id int, name text, version int, actual_id int) 

Lorsqu'un enregistrement change il est copié dans la table d'historique et les incréments de version actuelle. Les lignes ne peuvent pas être supprimées.

E.g. si nous avons 3 enregistrements A1, B1, C1 (1 est le numéro de version) et changer le nom de B, alors la table réelle contiendra A1, B2, C1 et l'histoire - B1. Nous pourrions alors changer le nom de C et les données réelles seront A1, B2, C3 et l'historique - B1, C1

Comment sélectionner les lignes par nom et numéro de version? Par exemple. version = 2 and name like '%' devrait nous donner A1, B2, C1 (A1 et C1 sont toujours actuels sur la version 2, ils sont inchangés à partir de la version 1).

je suis venu avec une union select comme:

select id, name, version from 
(
    select id, name, version, id as actual_id from actual 
    union select id, name, version, actual_id from history 
) q 
where version <= 2 and name like '%' 
group by actual_id 
order by version desc; 

Est-il possible de le faire sans union (à savoir Hibernate ne supporte pas) ou à l'aide d'une manière plus optimale?

Répondre

1

Je ne suis pas sûr ce que le fournisseur db OP est. Cependant, ce qui suit fonctionne sur MS SQL:

select * from (
select row_number() over (partition by id order by version desc) rn, 
     name 
from 
(
    select h.actual_id as id, h.name, h.version from history h 
    union all 
    select * from actual 
) x 
where version <= 2) y 
where rn = 1 
+0

Merci d'avoir signalé le fournisseur de la base de données. C'est la base de données PostgreSQL. Ajouté à la question – ike3

1

La manière intelligente de résoudre ceci est de mettre réellement la ligne réelle dans la table d'histoire aussi. Ensuite, il vous suffit de regarder dans l'historique lorsque vous voulez tout l'historique, et vous pouvez regarder à l'heure actuelle lorsque vous voulez rechercher les articles actuels. Vous pouvez également supprimer le tableau réel. Thats une désision architecturale si ..

+0

Je pense que c'est la meilleure solution mais vous avez raison - je ne peux pas changer l'architecture. – ike3