您的查询在几个地方有问题。它可能看起来像这样:
UPDATE trk2
SET (id, track_id, track_point) =
(next_id, x.track_fid, x.wkb_geometry)
FROM (
SELECT id
,nextval('seq_id') AS next_id
,track_fid
,wkb_geometry
FROM track_points_1
WHERE track_fid = 0
) x
WHERE trk2.id = x.id; -- adapt to your case
或更简单(首选语法):
UPDATE trk2
SET (id, track_id, track_point) =
(nextval('seq_id'), x.track_fid, x.wkb_geometry)
FROM track_points_1 x
WHERE x.track_fid = 0
AND trk2.id = x.id; -- adapt to your case
要点:
仅当您确实需要更改表中的每一行时,UPDATE
没有子句才有意义。WHERE
否则它是错误的或至少是次优的。
当您从另一个表中检索值时,CROSS JOIN
如果您不添加WHERE
将目标与源连接的子句,则会在目标和源之间得到一个 - 这意味着目标表的每一行都将使用源表中的每一行进行更新。这可能需要很长时间并导致任意结果。最后UPDATE
获胜。简而言之:这几乎总是完全无稽之谈,而且非常昂贵。
在我的示例中,我按id
列链接目标和源。您必须用适合您情况的任何内容替换它。
您可以SET
在 中的一个子句中分配多个值UPDATE
,但您只能从相关的子选择表达式中返回一个值。SET
因此,在具有多个值的子句中严格不可能有子选择。
您的初始语法错误来自您的子选择周围缺少一对括号。但是添加它只会揭示上面提到的错误。
根据您所追求的,您可以直接包含nextval('seq_id')
在子查询或SET
子句中。这可能会导致非常不同的结果,尤其是当子查询中有未在UPDATE
.
我把它放在SET
子句中是因为我怀疑这就是你想要的。行的顺序仍然是任意的。如果您想更好地控制分配的号码,您需要定义您想要的,然后采取不同的路线。