Bạn đã thử UPDATE .. FROM không chuẩn của Postgres chưa mệnh đề? Tôi tưởng tượng, điều này sẽ hoạt động
update mytable
set a = first_part(gen.id),
b = second_part(gen.id),
c = third_path(gen.id)
from (
select genid() as genid, id
from mytable
where package_id = 10
) gen
where mytable.id = gen.id;
--and package_id = 10 -- This predicate is no longer necessary as the subquery
-- already filters on package_id, as Erwin mentioned
Lưu ý rằng tôi đang buộc genid() được gọi chính xác một lần cho mỗi bản ghi trong mytable trong phần chọn phụ. Sau đó, tôi đang tự tham gia mytable và gen sử dụng id giả định . Xem tài liệu tại đây:
https://www.postgresql.org/docs/current/interactive /sql-update.html
Tuy nhiên, điều này dường như chỉ được giới thiệu với Postgres 9.0. Nếu điều đó có vẻ quá phức tạp (tức là không dễ đọc lắm), bạn vẫn có thể sử dụng pgplsql với tư cách là người dùng Florin được đề xuất tại đây
.