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