U moet uw tabelnamen en aliassen juist hebben. Bovendien is de verbinding tussen de twee tabellen de kolom image (data in de nieuwe tabel 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;
Zoals uitgelegd in mijn oude antwoord waarnaar je verwees, image moet uniek zijn in task_log om dit te laten werken:
Ik heb een techniek toegevoegd voor het ondubbelzinnig maken van niet-unieke waarden in het antwoord waarnaar wordt verwezen. Ik weet niet zeker of je dubbele afbeeldingen in file_data wilt hebben , hoewel.
In de RETURNING clausule van een INSERT u kunt alleen naar kolommen verwijzen vanuit de ingevoegde rij. De handleiding:
Vetgedrukte nadruk van mij.
Dubbele bronwaarden vouwen
Als u afzonderlijke vermeldingen wilt in de doeltabel van de INSERT (task_log ), alles wat je in dit geval nodig hebt is DISTINCT in de eerste 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;
De resulterende file_data.id wordt meerdere keren gebruikt in task_log . Houd er rekening mee dat meerdere rijen in task_log wijs nu naar dezelfde afbeelding in file_data . Voorzichtig met updates en verwijderingen ...