2016-05-24 51 views
0

選擇我有PostgreSQL的數據庫中有兩個數據庫表:實際/歷史記錄表:通過版本號

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不支持的話)或者使用一些更好的方法?

回答

1

我不知道什麼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 
+0

感謝您指出數據庫供應商。這是PostgreSQL數據庫。添加到問題中。 – ike3

1

解決這個問題的巧妙方法是將實際的行也放入歷史表中。然後,當你想要所有的歷史記錄時,只需查看歷史記錄,並且可以查看實際何時需要查找當前項目的實際情況。

或者您完全刪除實際表。這是一個建築設計儘管..

+0

我認爲這是最好的解決方案,但你是對的 - 我無法改變架構。 – ike3