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