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