テーブル名とエイリアスを正しく取得する必要があります。さらに、2つのテーブル間の接続は列 imageです。 (データコード> 新しいテーブル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;
あなたが参照した私の古い答えで説明されているように、 image task_logで一意である必要があります これが機能するために:
参照された回答の一意でない値を明確にする方法を追加しました。 file_dataに重複する画像が必要かどうかわからない 、しかし。
RETURNINGで INSERTの句 挿入された行からのみ列を参照できます。 マニュアル:
大胆な強調鉱山。
重複するソース値を折りたたむ
INSERTのターゲットテーブルに個別のエントリが必要な場合 ( task_log )、この場合に必要なのは DISTINCTだけです 最初の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;
結果のfile_data.id task_logで複数回使用されています 。 task_logの複数の行に注意してください file_data内の同じ画像を指すようになりました 。更新と削除に注意してください...