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...