选择某些行的多个副本,其他行的单个副本用于 INSERT

SELECTING multiple copies of some rows, single copies of others for INSERT

在 Postgres 中,我想将 table 个模板中的行复制到 table 个实例中。诀窍是,我想制作一些行的多个副本,而其他行只制作一个副本。

一个无效的语法示例:

INSERT INTO owned_instances
(
  template_id,
  owner,
  property1,
  property2,
  etc
)
SELECT
  id,
  '478aa65e-ecf7-48fb-bc20-f7fcf300aaa9',
  property1,
  property2,
  etc
FROM templates
WHERE id IN (1, 1, 1, 2, 3);

此处的目的是所有者将收到 3 份模板 1,以及各 1 份模板 2 和 3。

此版本不可用。 WHERE id IN 只抓取每个列出的 id 的一个副本。我尝试过的其他语法同样没有结果。

当然可以使用多个插入调用,但我想知道是否有一种简洁高效的方法可以在单个插入中执行此操作。


试图预测一个问题: table 个实例中的副本稍后将单独变异。因此,仅添加一列来计算一行代表多少副本的快速解决方案在这种情况下不起作用。

您的方向正确,但您需要加入包含 id 值的 table:

INSERT INTO owned_instances (template_id, owner, property1, property2, etc)
SELECT
    i.id,
    '478aa65e-ecf7-48fb-bc20-f7fcf300aaa9',
    t.property1,
    t.property2,
    t.etc
FROM templates t
INNER JOIN (
    SELECT 1 AS id UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
    SELECT 2 UNION ALL SELECT 3
) i
    ON i.id = t.id;