实际/历史表:按版本号选择

时间:2016-05-24 05:32:47

标签: sql postgresql database-versioning

我在PostgresSQL数据库中有两个数据库表:

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

当记录更改时,它将被复制到历史记录表中,并且实际版本会增加。行无法删除。

E.g。如果我们有3条记录A1, B1, C1(1是版本号)并更改B的名称,那么实际的表格将包含A1, B2, C1和历史记录 - B1。然后,我们可以更改C的名称,实际数据将为A1, B2, C3和历史记录 - B1, C1

如何按名称和版本号选择行?例如。 version = 2 and name like '%'应该给我们A1, B2, C1(A1和C1在版本2上仍然是实际的,它们与版本1相同)。

我提出了一个工会选择,例如:

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;

是否可以在没有联合的情况下执行此操作(即Hibernate不支持它)或使用更优化的方式?

2 个答案:

答案 0 :(得分:1)

解决此问题的明智方法是将实际行实际放入历史记录表中。然后,只需查看历史记录中的所有历史记录,就可以查看当前要查找当前项目的实际情况。

或者您完全废弃实际表。这是一个建筑设计虽然..

答案 1 :(得分:1)

我不确定OP的db供应商是什么。但是,以下适用于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