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?
Merci d'avoir signalé le fournisseur de la base de données. C'est la base de données PostgreSQL. Ajouté à la question – ike3