PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PostgreSQL:como atualizar linhas no CTE

with cte as(
select ....... from aTable
),update_cte as(
update cte set aField=(select somthing from cte1)
)

Você não pode fazer isso.

Uma UPDATE não pode fazer referência a um termo CTE no PostgreSQL, pois os CTEs são materializados. Eles não são apenas visualizações sobre os dados subjacentes. (Isso às vezes é muito chato, mas é assim que é).

Você pode:
CREATE TEMPORARY VIEW someview AS SELECT ... FROM atable;

UPDATE someview SET afield = ...

Se você quiser; que funcionará em versões mais recentes do PostgreSQL que suportam visualizações automaticamente atualizáveis. Acho que 9.2 sim.

Caso contrário, acho que você quer algo como:
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 *;

mas realmente, por favor não chame seus termos de CTE cte , cte1 , etc. Dê a eles nomes úteis e descritivos que digam o que são. É como programas cheios de variáveis ​​chamadas a através de x ... a próxima pessoa que tiver que manter seu código, ou qualquer pessoa a quem você peça ajuda, não gosto disso.