【问题标题】:Single INSERT with multiple rows from multiple SELECT statements来自多个 SELECT 语句的多行的单个 INSERT
【发布时间】:2021-10-01 15:06:01
【问题描述】:

我有多个 (> 100) 个 PostgreSQL INSERT 语句,它们看起来都像这个,但有不同的选择:

INSERT INTO schema.table (geom, name, label, flag, type)
SELECT (geom, <complicated string concatenation from multiple fields>, the_label, TRUE, type_id)
FROM abc.xzy a WHERE a.changelog = 1
ORDER BY a.num;

当然,SQL 查询可能会改变,但它的输出是为了满足INSERT 的要求。

我想用一个INSERT 来完成这一切。也许使用 VALUES 子句,例如:

INSERT INTO ... VALUES
  (val1,val2,val3,val4,...)
, (val11,val12,val13,val14,...)

这表明 here 可以使用简单的“静态”值(不是来自 SELECT 语句)。

但它不适用于SELECT 来获取INSERT 的值:

INSERT INTO schema.table (geom, name, label, flag, type)
VALUES
  (
    SELECT (geom, <complicated string concatenation from multiple fields>, the_label, TRUE, type_id)
    FROM abc.xzy a WHERE a.changelog = 1
    ORDER BY a.num
  ),
  (
    SELECT (geom, <complicated string concatenation from multiple fields>, a_label, FALSE, type_id)
    FROM def.uvt a WHERE a.typedf
    ORDER BY a.idx
  ),
...
);

我收到一个错误:subquery must return only one column 在第一个左括号上,就在第一个 SELECT 之前。

如果可能的话,我该如何解决这个问题?

PG 版本 >= 9.6。

【问题讨论】:

    标签: sql postgresql sql-insert


    【解决方案1】:

    您的尝试表明(字段)和(记录)之间存在混淆。

    您不需要VALUES 表达式。直接使用SELECT 语句即可。将多个SELECTUNION ALL 链接起来:

    INSERT INTO schema.table (geom, name, label, flag, type)
    (
    SELECT geom, <complicated string concatenation from multiple fields>, the_label, TRUE, type_id
    FROM   abc.xzy a WHERE a.changelog = 1
    ORDER  BY a.num
    )
    UNION ALL
    (
    SELECT geom, <complicated string concatenation from multiple fields>, a_label, FALSE, type_id
    FROM   def.uvt a WHERE a.typedf
    ORDER  BY a.idx
    );
    

    仅需要额外的括号来允许ORDER BYSELECT。但这仅在行的物理顺序相关时才有用。 (用于性能优化。)插入行的顺序没有其他意义,以后可以随着写入操作而改变。所以你可能只想:

    INSERT INTO schema.table (geom, name, label, flag, type)
    SELECT geom, <complicated string concatenation from multiple fields>, the_label, TRUE, type_id
    FROM   abc.xzy a WHERE a.changelog = 1
    UNION ALL
    SELECT geom, <complicated string concatenation from multiple fields>, a_label, FALSE, type_id
    FROM   def.uvt a WHERE a.typedf;
    

    【讨论】:

      猜你喜欢
      • 2012-01-27
      • 2021-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      相关资源
      最近更新 更多