我正在尝试获取从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}}未在同一查询中同时提供VALUES
和FROM
的任何示例。这种查询的正确语法是什么?或者是不可能以这种方式表达我的查询?
答案 0 :(得分:4)
您不需要公用表表达式。
INSERT INTO purchases (name, other_details, some_more_stuff)
SELECT name, $2, $3
FROM programmes
WHERE id = $1
您尝试应用的语法不正确。您不能在VALUES列表中使用表或查询中的列,因为列表必须只包含常量。来自the documentation(强调补充):
VALUES提供了一种生成“常量表”的方法,可以在查询中使用,而无需在磁盘上实际创建和填充表。
答案 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不允许"常量"子查询。)