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