with cte as(
select ....... from aTable
),update_cte as(
update cte set aField=(select somthing from cte1)
)
Bạn không thể làm điều đó.
UPDATE
có thể không tham chiếu đến một thuật ngữ CTE trong PostgreSQL, vì CTE đã được vật chất hóa. Họ không chỉ xem dữ liệu cơ bản. (Điều đó đôi khi thực sự khó chịu, nhưng nó là như vậy).
Bạn có thể:
CREATE TEMPORARY VIEW someview AS SELECT ... FROM atable;
UPDATE someview SET afield = ...
nếu bạn muốn; sẽ hoạt động trên các phiên bản PostgreSQL mới hơn hỗ trợ các chế độ xem có thể cập nhật tự động. Tôi nghĩ 9,2 đúng.
Nếu không, tôi nghĩ bạn muốn một cái gì đó như:
WITH cte1 as (
select ..... from bTable inner join cte using(anID)
)
update aTable
set aField=(select somthing from cte1)
WHERE ... where clause from cte ...
RETURNING *;
nhưng thực sự, xin hãy đừng gọi các điều khoản CTE của bạn cte
, cte1
, v.v ... Đặt cho chúng những cái tên hữu ích, có tính mô tả cho bạn biết chúng là gì. Nó giống như các chương trình chứa đầy các biến có tên a
thông qua x
... người tiếp theo phải duy trì mã của bạn hoặc bất kỳ ai mà bạn yêu cầu giúp đỡ, sẽ không thích nó.