Sql 复制并记录一些具有相关性的表
如何在主表中复制具有不同值但具有相同依赖项的条目(例如a_id=1) 作为手册Sql 复制并记录一些具有相关性的表,sql,postgresql,sql-insert,Sql,Postgresql,Sql Insert,如何在主表中复制具有不同值但具有相同依赖项的条目(例如a_id=1) 作为手册 CREATE TABLE a ( a_id SERIAL PRIMARY KEY, a_value varchar(255) ); CREATE TABLE b ( b_id SERIAL PRIMARY KEY, b_value varchar(255), a_id INT REFERENCES a(a_id) NOT NULL, UNIQUE (a_id, b_va
CREATE TABLE a (
a_id SERIAL PRIMARY KEY,
a_value varchar(255)
);
CREATE TABLE b (
b_id SERIAL PRIMARY KEY,
b_value varchar(255),
a_id INT REFERENCES a(a_id) NOT NULL,
UNIQUE (a_id, b_value)
);
CREATE TABLE c (
c_id SERIAL PRIMARY KEY,
c_value varchar(255),
b_id INT REFERENCES b(b_id) NOT NULL,
UNIQUE (b_id, c_value)
);
INSERT INTO a (a_value) VALUES ('a1'),('a2'),('a3');
INSERT INTO b (a_id, b_value) VALUES (1, 'b01'),(1, 'b02'),(2, 'b01'),(2, 'bbb'),(3, 'b3');
INSERT INTO c (b_id, c_value) VALUES (1, 'c1'),(1, 'c2'),(1, 'c3'),(2, 'c1'),(2, 'c2'),(2, 'c3'),(4, 'c2');
使用两个表可以完成以下工作:
INSERT INTO a (a_value) SELECT 'copy_' || a_value FROM a RETURNING a_id;
--give a_id = 4;
INSERT INTO b (a_id, b_value) SELECT 4, b_value FROM b WHERE b.a_id = 1 RETURNING b_id;
--give b_id = 6 and 7
INSERT INTO c (b_id, c_value) SELECT 6, c_value FROM c WHERE c.b_id = 1;
INSERT INTO c (b_id, c_value) SELECT 7, c_value FROM c WHERE c.b_id = 2;
但是如何复制表C中的记录呢?有四张桌子吗
以前
WITH
a_ AS (
INSERT INTO a (a_value) SELECT 'copy_'||(SELECT COUNT(a_id) FROM a WHERE a_value LIKE 'copy_%')||'_'||a_value FROM a WHERE a_id = 1 RETURNING a_id
)
INSERT INTO b (a_id, b_value)
SELECT a_.a_id, b_value FROM a_, b WHERE b.a_id = 1 RETURNING b_id
b
c
之后
a
b
c
我在表B中添加了一列
c_id| b_id| c_value
--------------
1 | 1 | c1
2 | 1 | c2
3 | 1 | c3
4 | 2 | c1
5 | 2 | c2
6 | 2 | c3
7 | 4 | c2
8 | 6 | c1
9 | 6 | c2
10 | 6 | c3
11 | 7 | c1
12 | 7 | c2
13 | 7 | c3
并以
old_b_id INT REFERENCES b(b_id)
这是工作 我在表B中添加了列
c_id| b_id| c_value
--------------
1 | 1 | c1
2 | 1 | c2
3 | 1 | c3
4 | 2 | c1
5 | 2 | c2
6 | 2 | c3
7 | 4 | c2
8 | 6 | c1
9 | 6 | c2
10 | 6 | c3
11 | 7 | c1
12 | 7 | c2
13 | 7 | c3
并以
old_b_id INT REFERENCES b(b_id)
这是工作 您是否尝试过使用a AS(插入a…,b AS(插入b…)插入c…。?在b中插入新的2行,例如a_id=1的2行:在c中插入6行,例如b_id在(1,2)中,因此结果如下:这是您期望的使用两个表进行选择的结果?是的,但我也希望复制表c中的记录,其中包含指向表b中新条目的链接您是否尝试过使用a AS(插入a…),b AS(插入b…)插入c…?在b中插入新的2行,例如a_id=1的2行:在c中插入6行,例如b_id在(1,2)中,因此这里的结果是:您对使用两个表进行选择的预期结果?是,但我也希望复制表C中的记录,其中包含指向表B中新条目的链接
b_id| a_id| b_value
--------------
1 | 1 | b01
2 | 1 | b02
3 | 2 | b01
4 | 2 | bbb
5 | 3 | b3
6 | 4 | b01
7 | 4 | b02
c_id| b_id| c_value
--------------
1 | 1 | c1
2 | 1 | c2
3 | 1 | c3
4 | 2 | c1
5 | 2 | c2
6 | 2 | c3
7 | 4 | c2
8 | 6 | c1
9 | 6 | c2
10 | 6 | c3
11 | 7 | c1
12 | 7 | c2
13 | 7 | c3
old_b_id INT REFERENCES b(b_id)
WITH
a_ AS (
INSERT INTO a (a_value) SELECT 'copy_'||(SELECT COUNT(a_id) FROM a WHERE a_value LIKE 'copy_%')||'_'||a_value FROM a WHERE a_id = 3 RETURNING a_id
),
new_a AS(
SELECT b_id, a_.a_id FROM b, a_ WHERE b.a_id = 3
)
,b_ AS (
INSERT INTO b (a_id, b_value, old_b_id) SELECT new_a.a_id, b_value, new_a.b_id FROM new_a LEFT JOIN b USING(b_id) RETURNING b_id, old_b_id
)
INSERT INTO c (b_id, c_value) SELECT b_.b_id, c_value FROM c INNER JOIN b_ ON (c.b_id = b_.old_b_id)