PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Kembalikan data dari subpilihan yang digunakan dalam INSERT dalam Ekspresi Tabel Umum

Anda perlu mendapatkan nama tabel dan alias Anda dengan benar. Plus, koneksi antara dua tabel adalah kolom image (data di tabel baru 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;

Seperti yang dijelaskan dalam jawaban lama saya yang Anda rujuk, image harus unik di task_log agar ini berhasil:

Saya menambahkan teknik bagaimana membedakan nilai non-unik dalam jawaban yang direferensikan. Tidak yakin apakah Anda ingin gambar duplikat di file_data , meskipun.

Dalam RETURNING klausa dari INSERT Anda hanya dapat mereferensikan kolom dari baris yang disisipkan. Manual:

Penekanan saya yang berani.

Lipat nilai sumber duplikat

Jika Anda ingin entri yang berbeda dalam tabel target INSERT (task_log ), yang Anda butuhkan dalam hal ini adalah DISTINCT di awal 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 yang dihasilkan digunakan beberapa kali di task_log . Ketahuilah bahwa beberapa baris di task_log sekarang arahkan ke gambar yang sama di file_data . Hati-hati dengan pembaruan dan penghapusan ...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Iterasi lebih dari integer[] di PL/pgSQL

  2. Bagaimana cara membagi nilai menjadi beberapa baris pada karakter baris baru di PostgreSQL?

  3. PostgreSQL:nama batasan default

  4. Parameter Koneksi PDO Keep-Alive TCP

  5. Instal dan Hubungkan ke PostgreSQL 10 di Ubuntu 16.04