Điều này sẽ đơn giản hơn cho UPDATE
, nơi các hàng bổ sung được tham gia vào bản cập nhật được hiển thị cho RETURNING
mệnh đề:
- Trả lại các giá trị cột trước khi CẬP NHẬT Chỉ sử dụng SQL - Phiên bản PostgreSQL
Hiện tại cũng vậy không có thể cho INSERT
. Theo tài liệu:
Biểu thức có thể sử dụng bất kỳ tên cột nào của bảng được đặt tên bởi table_name
table_name là mục tiêu của INSERT
lệnh.
Bạn có thể sử dụng CTE (sửa đổi dữ liệu) để làm cho điều này hoạt động.
Giả sử title
trở thành duy nhất cho mỗi truy vấn , nếu không, bạn cần phải làm thêm:
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);
Nếu title
không phải là duy nhất cho mỗi truy vấn (nhưng ít nhất id
là duy nhất trên mỗi bảng):
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);
Truy vấn thứ hai này dựa vào chi tiết triển khai không có tài liệu mà các hàng được chèn theo thứ tự được cung cấp. Nó hoạt động trong tất cả các phiên bản hiện tại của Postgres và có lẽ sẽ không bị hỏng.
SQL Fiddle.