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