Трябва да уточните имената и псевдонимите на вашите таблици. Освен това връзката между двете таблици е колоната image
(data
в новата таблица 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;
Както е обяснено в стария ми отговор, който споменахте, image
трябва да е уникален в task_log
за да работи това:
Добавих техника как да разграничавам неуникалните стойности в посочения отговор. Не съм сигурен дали искате дублирани изображения в file_data
, обаче.
В RETURNING
клауза на INSERT
можете да препращате само към колони от вмъкнатия ред. Ръководството:
Удебелен акцент е мой.
Сгъване на дублиращи се изходни стойности
Ако искате отделни записи в целевата таблица на INSERT
(task_log
), всичко, от което се нуждаете в този случай, е DISTINCT
в началния 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;
Полученият file_data.id
се използва многократно в task_log
. Имайте предвид, че множество редове в task_log
сега посочете същото изображение във file_data
. Внимавайте с актуализациите и изтриванията...