Sie müssen Ihre Tabellennamen und Aliase richtig eingeben. Außerdem ist die Verbindung zwischen den beiden Tabellen die Spalte image (data in der neuen Tabelle 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;
Wie in meiner alten Antwort erklärt, auf die Sie verwiesen haben, image muss im task_log eindeutig sein damit das funktioniert:
Ich habe eine Technik hinzugefügt, mit der nicht eindeutige Werte in der referenzierten Antwort disambiguiert werden können. Sie sind sich nicht sicher, ob Sie doppelte Bilder in file_data möchten , obwohl.
In der RETURNING -Klausel eines INSERT Sie können nur auf Spalten aus der eingefügten Zeile verweisen. Das Handbuch:
Fettdruck von mir.
Doppelte Quellwerte falten
Wenn Sie eindeutige Einträge in der Zieltabelle des INSERT wünschen (task_log ), alles, was Sie in diesem Fall brauchen, ist DISTINCT im anfänglichen 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;
Die resultierende file_data.id wird mehrfach in task_log verwendet . Beachten Sie, dass mehrere Zeilen in task_log zeigen Sie nun auf dasselbe Bild in file_data . Vorsicht bei Aktualisierungen und Löschungen ...