Postgresql - 基于多个SELECT的INSERT INTO

3

我打算在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;

请问您能够帮忙让这个工作起来吗?谢谢!


3
“insert”需要放在“with”之后 - 但整个语句没有意义。你定义了两个公共表表达式(CTE),但是你从未使用它们。你具体想要做什么? - user330315
1个回答

3
注意:我猜测您在这里想要做什么。我的猜测是,您想要插入一行数据,并使用CTE(即WITH块)中的值。如果语法正确,您当前的查询会为srctab中的每一行插入一行到dsttab中。

这里不真正需要CTE。只有当您需要多次引用同一子查询时才应该使用CTE,这是它们存在的原因。 (偶尔情况下,您可以在PostgreSQL中滥用它们以控制某些性能方面,但这对于其他DB来说并非如此,而且无论如何都应该尽可能避免。)

只需将您的查询放在同一行中:

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

关键点在于用括号将子查询包围起来。

你的解释更有道理,尽管我不太欣赏那个踩票。 - Gordon Linoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接