PostgreSQL不接受INSERT和VALUES和FROM?

时间:2017-03-25 16:01:51

标签: sql postgresql insert-select

我正在尝试获取从SELECT获得的值,然后INSERT将该值与其他值一起提供到另一个表中:

WITH data AS (SELECT name FROM programmes WHERE id = $1)
INSERT INTO purchases (name, other_details, some_more_stuff)
VALUES (data.name, $2, $3) FROM data;

但PostgreSQL提供42601 ERROR: syntax error at or near "FROM" LINE 1: ...(data.name, $2, $3) FROM data

INSERT的{​​{3}}未在同一查询中同时提供VALUESFROM的任何示例。这种查询的正确语法是什么?或者是不可能以这种方式表达我的查询?

2 个答案:

答案 0 :(得分:4)

您不需要公用表表达式。

INSERT INTO purchases (name, other_details, some_more_stuff) 
SELECT name, $2, $3
FROM programmes 
WHERE id = $1

您尝试应用的语法不正确。您不能在VALUES列表中使用表或查询中的列,因为列表必须只包含常量。来自the documentation(强调补充):

  

VALUES提供了一种生成“常量表”的方法,可以在查询中使用,而无需在磁盘上实际创建和填充表。

另见VALUES syntax.

答案 1 :(得分:2)

使用insert . . . select

WITH data AS (
      SELECT name
      FROM programmes 
      WHERE id = $1
    )
INSERT INTO purchases (name, other_details, some_more_stuff) 
    SELECT data.name, $2, $3
    FROM data;

这不仅仅是Postgres。这就是SQL的工作原理。说实话,我不认为学习insert . . . values特别有用,因为你可以使用insert . . . select做更多的事情。 (好吧,除非您使用的MS Access不允许"常量"子查询。)