sql >> Base de Datos >  >> RDS >> PostgreSQL

Devolver datos de la subselección utilizada en INSERT en una expresión de tabla común

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