Postgresql 从用于插入值的查询返回字段

Postgresql 从用于插入值的查询返回字段,postgresql,Postgresql,使用查询时,选择为插入生成值,如下所示: INSERT INTO some_table ( foo, bar ) SELECT at.foo, at.bar FROM another_table at; 如何从RETURNING子句中的SELECT查询返回字段以及新插入的行?比如: INSERT INTO some_table AS t ( foo, bar ) SELECT at.foo, at.bar FROM another_table at RETURN

使用
查询时,选择
插入生成值,如下所示:

INSERT INTO some_table (
  foo,
  bar
)
SELECT
  at.foo,
  at.bar
FROM another_table at;
如何从
RETURNING
子句中的
SELECT
查询返回字段以及新插入的行?比如:

INSERT INTO some_table AS t (
  foo,
  bar
)
SELECT
  at.foo,
  at.bar
FROM another_table at
RETURNING t.id, at.id;
我肯定我以前做过,或者我忽略了一些非常明显的事情

有可能这样做吗?如果是,怎么做?


您可以尝试CTE方法。首先选择所有相关数据,将结果存储在内部。然后使用这些数据执行
INSERT
语句,在内部存储
返回的值。毕竟,您可以使用所有保存的数据,将它们与联接组合,并打印出所需的内容。

无法从查询中返回字段,该查询提供了插入的值。只能从新插入的行返回字段


UPDATE
可以从更新的行以及从查询的列表中返回字段。

查询CTE时是否保证顺序?我刚意识到我在考虑更新。当使用update时,可以使用RETURNING从from子句返回字段。CTE与简单子查询相同。它只在内部存储数据以供进一步使用。如果要确保某个顺序,必须将其同时放入子查询和CTE中。这没有问题:)您的解决方案没有真正回答这个问题,即是否可以返回提供插入值的查询字段?答案是否定的。虽然您的解决方案适用于某些场景,但它不适合这里。此外,您的解决方案假定两个id字段相等,而它们很可能不相等。您还使用了一个非限定的
连接
,它实际上是一个
交叉连接
,没有人希望这样做。我自己也回答了这个问题。我不确定我是否理解你的问题:首先,没有交叉连接,只有合格的内部连接。交叉连接将导致第二种情况:查询将准确地提供这些已插入的记录,并将它们(与连接)与正确的返回id组合,而无需重新执行查询。这不是你想做的吗?
WITH selecting AS (
    SELECT id, x FROM a 
), inserting AS (
    INSERT INTO b AS b (y) 
    SELECT x FROM selecting
    RETURNING id, y
)
SELECT
    i.id, 
    s.id
FROM 
    inserting i
JOIN
    selecting s
ON i.y = s.x