Actual/history table: select 按版本号

Actual/history table: select by version number

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

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

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

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

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

我想到了一个联合 select 例如:

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 不支持它)或使用一些更优化的方式来做到这一点?

解决这个问题的聪明方法是将实际行也实际放入历史记录中 table。然后,当你想要所有历史记录时,你只需查看历史记录,当你想要 fadt 查找当前项目时,你可以查看实际。

或者您完全废弃 实际 table。不过那是一个架构设计..

我不确定 OP 的数据库供应商是什么。然而,以下适用于 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