我把这个问题从一个复杂得多的查询中分离出来。下面是测试场景:
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');
如果我运行查询:
SELECT * FROM test WHERE id IN (UPDATE test set description='test' RETURNING id)
我得到以下错误:
错误:“test”行1处或附近的语法错误:SELECT * FROM test WHERE id(UPDATE test set description='test' RE... ^
费勒先生你好
ERROR:syntax error at or near“test”SQL Status:42601
但是如果我只运行语句
UPDATE test set value='test' RETURNING id
我得到一个有两行的结果:
十二
如果我替换这个结果,我会得到一个类似于以下的查询:
SELECT * FROM test WHERE id IN (1,2);
结果是:
1;“test”2;“test”
为什么我的初始语句没有得到相同的结果?
7条答案
按热度按时间xnifntxz1#
在PostgreSQL 9之前。1 INSERT/UPDATE/DELETE只能用作顶级语句。这就是为什么你得到一个语法错误。
从9开始。1可以将数据修改语句与公用表表达式一起使用。您的示例查询如下所示:
从刚刚修改的表中选择时要小心。你可能会得到令人困惑的结果。因为查询是在同一个快照中执行的,所以SELECT不会看到UPDATE语句的效果。
sf6xfgos2#
在
UPDATE
查询中更新两行,添加WHERE
子句以限制受影响的行。返回
single row
。csbfibhn3#
将为您提供初始查询所期望的结果集。
但我怀疑你想做更复杂的事?
hgncfbus4#
您是否缺少
IN
:... WHERE id IN (UPDATE ...
?但是,如果我只运行语句“UPDATE test set value='test' RETURNING id”,我会得到一个2行的结果。为什么会这样呢?
UPDATE
没有WHERE
子句,因此它更新每一行,其中有两行。whitzsjs5#
你没有限制你的where子句。你需要有id =(blahblah)或id IN(blahblah)
vsdwdz236#
6jjcrrmo7#
我是蚂蚁Aasma的加法,如果在同一个表上选择,使用: