Saya menulis pekerjaan untuk mengubah data dari desain lama menjadi desain baru. Dalam proses ini, saya perlu mengambil id dari sisipan ke tabel terpisah dan menggunakannya dalam sisipan ke tabel target, seperti:
CREATE TABLE t1 {
t1_id BIGSERIAL,
col1 VARCHAR
};
CREATE TABLE t2 {
t2_id BIGSERIAL,
col2 VARCHAR, -- renamed from col1 to avoid confusion
t1_id BIGINT REFERENCES t1.t1_id
};
Saya memiliki SQL yang didefinisikan yang cocok dengan formulir berikut:
WITH ins AS (
INSERT INTO t1 (t1_id) VALUES (DEFAULT) RETURNING t1_id
) INSERT INTO t2
(col1, t1_id)
SELECT
a.val1, (SELECT * FROM ins)
FROM t3 a;
Saya ingin ini untuk menjalankan SELECT * FROM ins
untuk setiap baris SELECT
.. tetapi alih-alih hanya menjalankannya sekali dan menggunakan nilai itu untuk semua baris di SELECT
. Bagaimana saya bisa merestrukturisasi SQL saya untuk mendapatkan perilaku yang diinginkan?
sunting4
t1 akhirnya tampak seperti:
1,<NULL>
(1 row)
t2 akhirnya tampak seperti:
10,'a',1
11,'b',1 -- problem with id from t1 being 1
12,'c',1 -- problem with id from t1 being 1
.
.
Apa yang saya ingin t1 terlihat seperti:
1,<NULL>
2,<NULL>
3,<NULL>
.
.
Apa yang saya ingin t2 terlihat seperti:
10,'a',1
11,'b',2 -- id from t1 of 2
12,'c',3 -- id from t1 of 3
.
.
sunting Untuk mengatasi apa yang dikatakan a_horse_with_no_name, saya juga mencoba ini (dengan hasil yang sama):
WITH ins AS (
INSERT INTO t1 (t1_id) VALUES (DEFAULT) RETURNING t1_id
) INSERT INTO t2
(col1, t1_id)
SELECT
a.val1, b.t1_id
FROM t3 a
JOIN ins b ON TRUE;
sunting2
Saya baru saja mencoba mereferensikan yang sesuai SEQUENCE
dengan permintaan saya, dan itu TIDAK berfungsi - tapi saya tidak terlalu menyukai solusi itu (kebanyakan karena saya tidak suka nama objek yang sulit dikodekan). Jika ada solusi APA PUN lainnya daripada langsung merujuk nama SEQUENCE
saya akan sangat menghargainya. :)
sunting3
Saya kira solusi lain adalah dengan menggunakan a PROCEDURE
untuk melakukan INSERT
bukan CTE .. tapi saya masih menghargai opsi / saran.
t1
dan tidak memberikan nilai apa pun untuk t1.col1
. Di mana seharusnya data datang untuk kolom itu? Apakah t1.col1
terkait dengan t2.col1
?
INSERT INTO t1 (t1_id) VALUES (DEFAULT)
hanya memasukkan 1 baris ke dalam t1
. Jadi tidak masalah jika Anda meletakkan ins
di FROM
klausa dan bergabung ke t3
atau tidak. Bisakah Anda menunjukkan kepada kami bagaimana Anda akan memasukkan 2 (atau lebih) baris ke dalam t1
? Dan yang lebih penting, bagaimana Anda tahu yang mana dari 2 (atau lebih) t1.id
nilai yang akan cocok dengan baris yang dimasukkan t2
?
ins
dant3