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