PostgreSQL 重复多行

PostgreSQL duplicate multiple rows

有一个应用程序需要由用户(管理员)通过 UI (contenteditable=true) 翻译table。 为此,我创建了一个带有 table 的 postgres(PostgreSQL 版本 13.5)数据库,其中包含以下内容:

|lang|key |createdby|version|value|
|----| ---| ---  | --- | --- |
|en | key.to.value |someone| 4 | some english words|
|en | key.to.value |someone| 3 | some egnlish words|
|en | key.to.value |someone| 42 | some english words|
|de | key.to.value|someone|12|some german words|
|de | key.to.value|someone|23456|some german words|

lang 键和版本为主键。

每列的类型都是文本。 table 还包含条目的所有旧版本,以便在需要时能够切换到旧版本。

现在我必须增加创建一种新语言的可能性,它具有英语行的最高版本数据,但 'new language'(西班牙语、葡萄牙语等)作为 lang,“1”作为版本。 用户将能够在 UI 中选择“添加新语言”并获取英语值以开始翻译。

编辑 我需要用最高版本复制每个英文行并将 lang 设置为 'whateEverLanguage' 并将版本设置为版本 '1'

那是我最后一次尝试:

insert into strings 
(lang, key, createdby, version, value) 
values 
(
(select 'esp'),
(select key from strings where lang='en' and version = (select max(version) from strings where lang='en')), 
(select createdby from strings where lang='en' and version = (select max(version) from strings where lang='en')),
(select version from strings where lang='en' and version = (select max(version) from strings where lang='en')),
(select value from strings where lang='en' and version = (select max(version) from strings where lang='en')));

大约 1 周前我才开始使用数据库。 我为此感到沮丧,所以请帮助我。

如果要为每个键检索 'en' 语言的最新版本,您需要过滤 lang = 'en' 所在的行,按 key 对行进行分组,对使用聚合函数按 version DESC、select 对行进行分组 第一行,例如 array_agg() :

SELECT key
     , (array_agg(value ORDER BY version DESC))[1]
  FROM strings
 WHERE lang = 'en'
 GROUP BY key

如果您只想要一个 specific_key 的 'en' 值,您可以另外过滤该键:

SELECT key
     , (array_agg(value ORDER BY version DESC))[1]
  FROM strings
 WHERE key = specific_key
   AND lang = 'en'
 GROUP BY key

如果你想插入新行,那么你可以这样做:

insert into strings (lang, key, createdby, version, value) 
select 'spanish'
     , key
     , (array_agg(createdby order by version desc))[1]
     , '1'
     , (array_agg(value order by version desc))[1]
  from strings
  where lang = 'en' 
  group by key

查看dbfiddle

中的测试结果