Musisz mieć prawidłowe nazwy tabel i aliasy. Dodatkowo połączenie między dwiema tabelami to kolumna image (data w nowej tabeli 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;
Jak wyjaśniono w mojej starej odpowiedzi, do której się odwołujesz, image musi być unikalny w task_log aby to zadziałało:
Dodałem technikę, jak odróżnić nieunikalne wartości w przywołanej odpowiedzi. Nie jestem pewien, czy chcesz zduplikować obrazy w file_data jednak.
W RETURNING klauzula INSERT możesz odwoływać się tylko do kolumn z wstawionego wiersza. Podręcznik:
Pogrubiony nacisk na moje.
Zwiń zduplikowane wartości źródłowe
Jeśli chcesz mieć różne wpisy w tabeli docelowej INSERT (task_log ), wszystko czego potrzebujesz w tym przypadku to DISTINCT w początkowym 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;
Wynikowy file_data.id jest używany wielokrotnie w task_log . Pamiętaj, że wiele wierszy w task_log teraz wskaż ten sam obrazek w file_data . Ostrożnie z aktualizacjami i usuwaniem ...