我在 PostgresSQL 数据库中有两个数据库表:
create table actual (id int, name text, version int)
create table history (id int, name text, version int, actual_id int)
当记录发生更改时,它会被复制到历史记录表中,并且实际版本会增加。无法删除行。
例如,如果我们有 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 不支持它)或使用一些更优化的方式的情况下做到这一点?