Musíte mít správné názvy a aliasy tabulek. Navíc spojením mezi dvěma tabulkami je sloupec image
(data
v nové tabulce 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 je vysvětleno v mé staré odpovědi, na kterou jste odkazovali, image
musí být jedinečné v task_log
aby to fungovalo:
Přidal jsem techniku, jak v odkazované odpovědi rozdělit nejedinečné hodnoty. Nejste si jisti, zda chcete duplicitní obrázky v file_data
, ačkoli.
V RETURNING
klauzule INSERT
můžete odkazovat pouze na sloupce z vloženého řádku. Příručka:
Odvážný důraz můj.
Složit duplicitní zdrojové hodnoty
Pokud chcete odlišné položky v cílové tabulce INSERT
(task_log
), vše, co v tomto případě potřebujete, je DISTINCT
v počátečním 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;
Výsledný file_data.id
se v task_log
používá několikrát . Uvědomte si, že více řádků v task_log
nyní ukažte na stejný obrázek v file_data
. Opatrně s aktualizacemi a mazáním ...