テーブル名とエイリアスを正しく取得する必要があります。さらに、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
内の同じ画像を指すようになりました 。更新と削除に注意してください...