Vous devez obtenir les noms et les alias de vos tables correctement. De plus, la connexion entre les deux tables est la colonne image (data dans la nouvelle table 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;
Comme expliqué dans mon ancienne réponse que vous avez référencée, image doit être unique dans task_log pour que cela fonctionne :
J'ai ajouté une technique pour lever l'ambiguïté des valeurs non uniques dans la réponse référencée. Vous ne savez pas si vous voudriez des images en double dans file_data , cependant.
Dans le RETURNING clause d'un INSERT vous ne pouvez référencer que les colonnes de la ligne insérée. Le manuel :
J'insiste sur moi.
Plier les valeurs source en double
Si vous voulez des entrées distinctes dans la table cible du INSERT (task_log ), tout ce dont vous avez besoin dans ce cas est DISTINCT dans le SELECT initial :
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;
Le résultat file_data.id est utilisé plusieurs fois dans task_log . Sachez que plusieurs lignes dans task_log pointe maintenant vers la même image dans file_data . Attention aux mises à jour et aux suppressions...