运行postgres 10,以下代码返回0行:
drop table if exists foo;
create table foo(t text);
with x as (
insert into foo values ('t') returning 't' as t)
select foo.* from foo join x on foo.t = x.t;
我希望它会返回1行。有人可以解释发生了什么吗?
答案 0 :(得分:1)
表foo
为空,因为当(整个)命令完成时,插入的行将可见。
请参阅the documentation(以及以下示例)中的此声明:
WITH中的子语句彼此同时并与主查询一起执行。因此,在WITH中使用数据修改语句时,指定更新实际发生的顺序是不可预测的。所有语句都使用相同的快照执行(参见第13章),因此它们无法“看到”彼此对目标表的影响。