我有 postgresql 数据库,我在其中保存 jee 应用程序的数据。用户可以编辑这些数据而无需创建新版本的实体(草稿)。在编辑期间,实体被复制为草稿(版本设置为 -1),编辑后用户可以将所有更改保存为新版本。我的问题是创建适当的 sql 查询以按版本获取数据,而不是提取所有数据并在应用程序中执行。
表架构:
id(uniq), field_id,version,otherFields....
id 是唯一值并自动递增。当用户开始编辑时,将使用 field_id=parent.id 创建新字段。所以我可以使用group by field_id提取所有版本的字段
情况1
我想获取当前版本,这意味着版本字段或版本的最大值设置为 -1。
案例二
我想获得特定版本。这并不容易,因为如果字段未被编辑(以节省空间),数据库中的数据不会更改。例如,字段a是使用版本 1创建的,然后对其他字段进行了更改。当前的全局版本是 7,但是字段a在数据库中仍然有一个版本为 1 的条目(该字段未被编辑)。因此,要提取不同于当前版本的特定版本,我需要获取MAX(version) where version<=:selected_version
示例数据:
id(uniq),field_id,version
1,1,1
3,1,7
55,1,-1
53,53,14
field_id=1 的实体有 2 个版本和草稿(用户正在编辑它)。
field_id=53 的实体只有一个版本,没有草稿。
我希望我对问题的解释是可以理解的。你能帮我做那些sql查询吗?它可以是两个查询,一个用于带有草稿的实际版本,另一个用于旧版本。
情况2可能的解决方案
我认为我可以使用此类查询提取特定版本
select field_id, max(version) ver from field_mappings where version<4 and version!='-1' group by field_id
我不知道为什么我不能提取 id。当我将查询更改为
select *, max(version) from field_mappings where version<4 and version!='-1' group by field_id
然后我得到了错误
ERROR: column "field_mappings.id" must appear in the GROUP BY clause or be used in an aggregate function
SQL: 42803
并且仍然不知道如何为草稿添加大小写(最大(版本)或版本=-1)。
您可以使用依赖于 DISTINCT ON 的以下内容,并将版本 -1 计算为 9999999:
查询检索具有唯一字段(按 )的所有行
field_id
,优先考虑您指定的版本或草稿版本(其优先级提高到顶部)。如果您想要草稿或最新版本,请使用
< 10000000
而不是< 4
.