Du måste få rätt tabellnamn och alias. Dessutom är kopplingen mellan de två tabellerna kolumnen image
(data
i den nya tabellen 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;
Som förklaras i mitt gamla svar du refererade till, image
måste vara unik i task_log
för att detta ska fungera:
Jag lade till en teknik för att disambiguera icke-unika värden i det refererade svaret. Inte säker på om du vill ha dubbletter av bilder i file_data
dock.
I RETURNING
sats av en INSERT
du kan bara referera till kolumner från den infogade raden. Handboken:
Djärv betoning min.
Vik dubbletter av källvärden
Om du vill ha distinkta poster i måltabellen för INSERT
(task_log
), allt du behöver i det här fallet är DISTINCT
i den initiala 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;
Den resulterande file_data.id
används flera gånger i task_log
. Tänk på att flera rader i task_log
peka nu på samma bild i file_data
. Var försiktig med uppdateringar och borttagningar ...