从 INSERT .. SELECT 中的 SELECT 表返回值

Mat*_*ieu 1 postgresql

我有一个看起来像这样的表:

| column | def  |
| ------ | ---- |
| id     | uuid |
| status | int  |
| data   | text |
Run Code Online (Sandbox Code Playgroud)

我想编写一个查询来复制一行(仅更改几列)并返回旧的(替换的)数据:

INSERT INTO tmp (status, data)
SELECT source.status, :data
FROM table AS source
WHERE id = :id
RETURNING id, source.data
Run Code Online (Sandbox Code Playgroud)

RETURNING只能访问插入行中的值,是否有其他方法可以做到这一点?

dez*_*zso 7

您可以将旧数据“存储”在 CTE 中,然后在另一个(可写)CTE 中进行更改,并返回原始值,如下所示:

WITH old AS (
    SELECT status, data
      FROM your_table
     WHERE id = :id 
),
new AS (
    INSERT INTO your_table
    SELECT status, :data
      FROM old
)
SELECT * FROM old;
Run Code Online (Sandbox Code Playgroud)

可写 CTE ( new) 基于前一个 ( ) 的结果old