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

Retornar dados da subseleção usada em INSERT em uma expressão de tabela comum


Você precisa acertar os nomes e aliases de suas tabelas. Além disso, a conexão entre as duas tabelas é a coluna image (data na nova tabela 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 explicado na minha resposta antiga que você mencionou, image deve ser exclusivo em task_log para que isso funcione:

Eu adicionei uma técnica como desambiguar valores não exclusivos na resposta referenciada. Não tenho certeza se você deseja imagens duplicadas em file_data , no entanto.

No RETURNING cláusula de um INSERT você só pode referenciar colunas da linha inserida. O manual:

Minha ênfase em negrito.

Dobre valores de origem duplicados


Se você quiser entradas distintas na tabela de destino do INSERT (task_log ), tudo que você precisa neste caso é DISTINCT no 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;

O file_data.id resultante é usado várias vezes em task_log . Esteja ciente de que várias linhas em task_log agora aponte para a mesma imagem em file_data . Cuidado com atualizações e exclusões...