PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Restituisce i dati da subselect utilizzati in INSERT in un'espressione di tabella comune

Devi avere i nomi e gli alias delle tue tabelle corretti. Inoltre, la connessione tra le due tabelle è la colonna image (data nella nuova tabella 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;

Come spiegato nella mia vecchia risposta a cui hai fatto riferimento, image deve essere univoco in task_log affinché funzioni:

Ho aggiunto una tecnica su come disambiguare i valori non univoci nella risposta di riferimento. Non sono sicuro se desideri immagini duplicate in file_data , però.

Nel RETURNING clausola di un INSERT puoi fare riferimento solo alle colonne della riga inserita. Il manuale:

Enfasi in grassetto la mia.

Piega i valori di origine duplicati

Se vuoi voci distinte nella tabella di destinazione del INSERT (task_log ), tutto ciò di cui hai bisogno in questo caso è DISTINCT nell'iniziale 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;

Il risultante file_data.id viene utilizzato più volte in task_log . Tieni presente che più righe in task_log ora punta alla stessa immagine in file_data . Attento ad aggiornamenti ed eliminazioni...