PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

PostgreSQL:как да актуализирате редове в CTE

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

Не можете да направите това.

UPDATE може да не препраща към CTE термин в PostgreSQL, тъй като CTE се материализират. Те не са просто изгледи върху основните данни. (Това понякога е наистина досадно, но е така).

Можете да:

CREATE TEMPORARY VIEW someview AS SELECT ... FROM atable;

UPDATE someview SET afield = ...

ако искаш; които ще работят на по-новите версии на PostgreSQL, които поддържат автоматично обновяеми изгледи. Мисля, че 9.2 го прави.

В противен случай мисля, че искате нещо като:

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 *;

но наистина, моля не наричайте термините си за CTE cte , cte1 и т.н. Дайте им полезни, описателни имена, които ви казват какво представляват. Това е като програми, пълни с променливи с имена a през x ... следващият човек, който трябва да поддържа вашия код, или всеки, когото помолите за помощ, не ще го направи харесвам го.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL, където обединеният набор трябва да съдържа всички стойности, но може да съдържа повече

  2. Създаване на съхранени процедури с SQLAlchemy

  3. Надстройка до PostgreSQL 11 с логическа репликация

  4. Замяна на съответстващ текст с regex с версия с главни букви в Postgresql

  5. ГРУПИРАНЕ ПО последователни дати, разделени с пропуски