Debe obtener los nombres y alias correctos de sus tablas. Además, la conexión entre las dos tablas es la columna image (data en la nueva tabla file_data ):
WITH inserted AS (
INSERT INTO file_data (data)
SELECT image
FROM task_log
WHERE image IS NOT NULL
RETURNING id, data -- can only reference target row
)
UPDATE task_log t
SET attachment_id = i.id
, attachment_type = 'INLINE_IMAGE'
FROM inserted i
WHERE t.image = i.data;
Como se explicó en mi respuesta anterior a la que hizo referencia, image debe ser único en task_log para que esto funcione:
Agregué una técnica sobre cómo eliminar la ambigüedad de los valores no únicos en la respuesta a la que se hace referencia. No estoy seguro si desea imágenes duplicadas en file_data , sin embargo.
En el RETURNING cláusula de un INSERT solo puede hacer referencia a columnas de la fila insertada. El manual:
Énfasis en negrita mío.
Doblar valores fuente duplicados
Si desea entradas distintas en la tabla de destino de INSERT (task_log ), todo lo que necesita en este caso es DISTINCT en el SELECT inicial :
WITH inserted AS (
INSERT INTO file_data (data)
SELECT DISTINCT image -- fold duplicates
FROM task_log
WHERE image IS NOT NULL
RETURNING id, data -- can only reference target row
)
UPDATE task_log t
SET attachment_id = i.id
, attachment_type = 'INLINE_IMAGE'
FROM inserted i
WHERE t.image = i.data;
El file_data.id resultante se usa varias veces en task_log . Tenga en cuenta que varias filas en task_log ahora apunta a la misma imagen en file_data . Cuidado con las actualizaciones y eliminaciones...