首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >来自多个SELECT语句的具有多行的单个插入

来自多个SELECT语句的具有多行的单个插入
EN

Stack Overflow用户
提问于 2021-10-01 15:06:01
回答 1查看 34关注 0票数 0

我有多条(> 100条) PostgreSQL INSERT语句,它们看起来都与下面的语句类似,但具有不同的选择:

代码语言:javascript
运行
复制
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子句:

代码语言:javascript
运行
复制
INSERT INTO ... VALUES
  (val1,val2,val3,val4,...)
, (val11,val12,val13,val14,...)

使用简单的“静态”值(而不是来自SELECT语句),这可以在here中工作。

但是它不能使用SELECT来获取INSERT的值

代码语言:javascript
运行
复制
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
  ),
...
);

我得到了一个错误:在第一个SELECT之前的第一个左括号中出现了subquery must return only one column

如果可能的话,我怎么解决这个问题呢?

PG版本为>= 9.6。

EN

回答 1

Stack Overflow用户

发布于 2021-10-01 15:26:09

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

您不需要VALUES表达式。直接使用SELECT语句即可。使用UNION ALL链接多个SELECT

代码语言:javascript
运行
复制
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
);

仅当允许每个SELECT使用ORDER BY时,才需要额外的括号。但这只在行的物理顺序相关的情况下才有用。(用于性能优化。)插入行的顺序没有其他意义,以后可以通过写操作进行更改。所以你可能只想:

代码语言:javascript
运行
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69408147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档