我将问题与更复杂的查询隔离开来.这里是测试场景
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语句的效果.
您在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)
将为您提供初始查询所期望的结果集。
但我怀疑你正在尝试更复杂的东西?