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