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

MASUKKAN KE ... DARI PILIH ... MENGEMBALIKAN pemetaan id

Ini akan lebih sederhana untuk UPDATE , di mana baris tambahan yang digabungkan ke dalam pembaruan dapat dilihat oleh RETURNING klausa:

  • Kembalikan Nilai Kolom pra-UPDATE Menggunakan SQL Saja - Versi PostgreSQL

Hal yang sama saat ini tidak mungkin untuk INSERT . Per dokumentasi:

Ekspresi dapat menggunakan nama kolom apa pun dari tabel yang diberi nama nama_tabel

nama_tabel menjadi target INSERT perintah.

Anda dapat menggunakan CTE (pengubah data) agar ini berfungsi.
Dengan asumsi title menjadi unik per kueri , jika tidak, Anda perlu melakukan lebih banyak:

WITH sel AS (
   SELECT id, title
   FROM   posts
   WHERE  id IN (1,2)   -- select rows to copy
   )
,    ins AS (
   INSERT INTO posts (title)
   SELECT title FROM sel
   RETURNING id, title
 )
SELECT ins.id, sel.id AS from_id
FROM   ins
JOIN   sel USING (title);

Jika title tidak unik per kueri (tetapi setidaknya id unik per tabel):

WITH sel AS (
   SELECT id, title, row_number() OVER (ORDER BY id) AS rn
   FROM   posts
   WHERE  id IN (1,2)   -- select rows to copy
   ORDER  BY id
   )
,    ins AS (
   INSERT INTO posts (title)
   SELECT title FROM sel ORDER  BY id  -- ORDER redundant to be sure
   RETURNING id
 )
SELECT i.id, s.id AS from_id
FROM  (SELECT id, row_number() OVER (ORDER BY id) AS rn FROM ins) i
JOIN   sel s USING (rn);

Kueri kedua ini bergantung pada detail implementasi yang tidak didokumentasikan bahwa baris dimasukkan dalam urutan yang disediakan. Ini berfungsi di semua versi Postgres saat ini dan mungkin tidak akan rusak.

SQL Fiddle.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana Div() Bekerja di PostgreSQL

  2. Bagaimana current_timestamp() Bekerja di PostgreSQL

  3. Apa sintaks PostgreSQL yang setara dengan Oracle CONNECT BY ... MULAI DENGAN?

  4. anotasi hibernasi yang tepat untuk byte[]

  5. bagaimana cara menampilkan kode prosedur tersimpan lengkap?