我有多条(> 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,...)
使用简单的“静态”值(而不是来自SELECT
语句),这可以在here中工作。
但是它不能使用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
),
...
);
我得到了一个错误:在第一个SELECT
之前的第一个左括号中出现了subquery must return only one column
。
如果可能的话,我怎么解决这个问题呢?
PG版本为>= 9.6。
发布于 2021-10-01 15:26:09
您的尝试表明值(字段)和行(记录)之间存在混淆。
您不需要VALUES
表达式。直接使用SELECT
语句即可。使用UNION ALL
链接多个SELECT
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
时,才需要额外的括号。但这只在行的物理顺序相关的情况下才有用。(用于性能优化。)插入行的顺序没有其他意义,以后可以通过写操作进行更改。所以你可能只想:
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;
https://stackoverflow.com/questions/69408147
复制相似问题