无法从postgres中的UPDATE RETURNING子句中选择

mar*_*kus 14 sql postgresql

我将问题与更复杂的查询隔离开来.这里是测试场景

DROP TABLE test; 
CREATE TABLE test (
  id integer,
  description varchar(100)
);

INSERT INTO test(id, description) VALUES (1,'new'); 
INSERT INTO test(id, description) VALUES (2,'new'); 
Run Code Online (Sandbox Code Playgroud)

如果我运行查询:

SELECT * FROM test WHERE id IN (UPDATE test set description='test' RETURNING id)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

错误:"test"或其附近的语法错误第1行:SELECT*FROM test WHERE id(UPDATE test set description ='test'RE ... ^

*** Fehler ***

错误:"test"或其附近的语法错误SQL状态:42601 Zeichen:37

但是,如果我只运行国家政府

UPDATE test set value='test' RETURNING id
Run Code Online (Sandbox Code Playgroud)

我得到一个2行的结果:

1 2

如果我代表结果,我会有一个查询,如:

SELECT * FROM test WHERE id IN (1,2);
Run Code Online (Sandbox Code Playgroud)

结果:

1;"测试"2;"测试"

为什么我的初始陈述没有得到相同的结果?

Ant*_*sma 34

在PostgreSQL 9.1 INSERT/UPDATE/DELETE之前只能用作顶级语句.这就是您收到语法错误的原因.

从9.1开始,您可以将数据修改语句与公用表表达式一起使用.您的示例查询将如下所示:

WITH updated AS (UPDATE test SET description = 'test' RETURNING id)
SELECT * FROM test WHERE id IN (SELECT id FROM updated);
Run Code Online (Sandbox Code Playgroud)

从刚刚修改过的表中进行选择时要小心.你可以这样得到令人困惑的结果.因为查询是在同一个快照中执行的,SELECT不会看到UPDATE语句的效果.

  • 仅供参考,CTE方法不适用于INSERT (2认同)

JK.*_*JK. 7

您在UPDATE查询中更新两行,添加一个WHERE子句以限制受影响的行.

UPDATE test SET description = 'test' WHERE id = 1 RETURNING id
Run Code Online (Sandbox Code Playgroud)

返回单行.


小智 5

UPDATE test set description='test' RETURNING *
Run Code Online (Sandbox Code Playgroud)

将为您提供初始查询所期望的结果集。

但我怀疑你正在尝试更复杂的东西?