Devi avere i nomi e gli alias delle tue tabelle corretti. Inoltre, la connessione tra le due tabelle è la colonna image (data nella nuova tabella 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;
Come spiegato nella mia vecchia risposta a cui hai fatto riferimento, image deve essere univoco in task_log affinché funzioni:
Ho aggiunto una tecnica su come disambiguare i valori non univoci nella risposta di riferimento. Non sono sicuro se desideri immagini duplicate in file_data , però.
Nel RETURNING clausola di un INSERT puoi fare riferimento solo alle colonne della riga inserita. Il manuale:
Enfasi in grassetto la mia.
Piega i valori di origine duplicati
Se vuoi voci distinte nella tabella di destinazione del INSERT (task_log ), tutto ciò di cui hai bisogno in questo caso è DISTINCT nell'iniziale SELECT :
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;
Il risultante file_data.id viene utilizzato più volte in task_log . Tieni presente che più righe in task_log ora punta alla stessa immagine in file_data . Attento ad aggiornamenti ed eliminazioni...