Postgresql - 基于多个SELECT的INSERT INTO

时间:2016-11-29 22:29:32

标签: sql postgresql

我打算在Postgresql中根据几个SELECT写一个INSERT INTO请求但是没有成功。 我有一个表包含我选择的数据(srctab),另一个表我插入数据(dsttab)。 这就是我的经历:

INSERT INTO dsttab (dstfld1, dstfld2) WITH
  t1 AS (
    SELECT srcfld1 
    FROM srctab 
    WHERE srcfld3 ='foo'
  ),
  t2 AS (
    SELECT srcfld5
    FROM srctab 
    WHERE srcfld6 ='bar'
  ) select srcfld1, srcfld5 from srctab;

你能帮忙完成这项工作吗?谢谢!

1 个答案:

答案 0 :(得分:1)

注意:我猜你想在这做什么。我的猜测是你要插入一行包含来自CTE的值(那是WITH块。)。如果写入的查询是有效的语法,则会在dsttab中为每行行插入一行srctab

这里你真的不需要CTE。实际上只应在需要多次引用相同子查询时才使用CTE;这就是他们的存在。 (偶尔,你可以在某种程度上滥用它们来控制PostgreSQL中的某些性能方面,但在其他数据库中并非如此,并且无论如何都应该避免这种情况。)

只需将您的查询排成一行:

INSERT INTO dsttab (dstfld1, dstfld2)
VALUES (
    (SELECT srcfld1 
    FROM srctab 
    WHERE srcfld3 ='foo'),
    (SELECT srcfld5
    FROM srctab 
    WHERE srcfld6 ='bar')
);

这里的关键是用括号括起子查询。