locking子句不能用于无法用单独的表行清楚地标识返回的行的上下文中;例如,它们不能与聚合一起使用。
如何在通过UNION (ALL)
实现的递归查询中解决此问题?
是否有比将递归查询的结果再次与表(这次与FOR UPDATE
合并)更好的解决方案?我必须为此查询锁定整个表,以确保对联接没有任何并发更改,对吗?
答案 0 :(得分:0)
是什么使您认为聚合与递归查询有关?似乎为我工作,
CREATE TABLE foo(pk,fk,description)
AS VALUES
( 1 , null , 'domains' ),
( 2 , 1 , 'people' ),
( 3 , 1 , 'cars' ),
( 4 , 2 , 'tom' ),
( 5 , 2 , 'smith' ),
( 6 , 3 , 'vmw' ),
( 7 , 2 , 'betty' ),
( 8 , 3 , 'ford' );
WITH RECURSIVE t(pk, fk, description, level) AS (
SELECT pk, fk, ARRAY[description], 0
FROM foo
WHERE fk IS NULL
UNION ALL
SELECT foo.pk, foo.fk, t.description || foo.description, t.level+1
FROM t
JOIN foo ON (foo.fk = t.pk)
)
SELECT *
FROM t
FOR UPDATE;