PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Renvoie les données de la sous-sélection utilisée dans INSERT dans une expression de table commune

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