Du skal have dine tabelnavne og aliasser rigtige. Plus, forbindelsen mellem de to tabeller er kolonnen image (data i den nye 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;
Som forklaret i mit gamle svar, du refererede til, image skal være unik i task_log for at dette virker:
Jeg tilføjede en teknik til, hvordan man disambiguerer ikke-unikke værdier i det refererede svar. Ikke sikker på, om du vil have dublerede billeder i file_data dog.
I RETURNING klausul af en INSERT du kan kun referere til kolonner fra den indsatte række. Manualen:
Fed fremhævelse mine.
Fold dublerede kildeværdier
Hvis du ønsker adskilte poster i måltabellen for INSERT (task_log ), alt hvad du behøver i dette tilfælde er DISTINCT i den indledende 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 resulterende file_data.id bruges flere gange i task_log . Vær opmærksom på, at flere rækker i task_log peg nu på det samme billede i file_data . Forsigtig med opdateringer og sletninger ...