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.