说我有这样的原始数据:
foo bar baz
1 a b
1 x y
2 z q
我想最终得到三个表,其中I
和III
是主表,II
是I
和{{1}之间的关联表}}
予。 e。:
III
I
id foo
1 1
2 2
II
请注意,I_ID是串行而非foo
id I_id III_id
1 1 1
2 1 2
3 2 3
III
我如何一次性插入?
我玩过CTE,但我对以下内容感到困惑:如果我从id bar baz
1 a b
2 x y
3 z q
开始然后返回ID,我就看不出如何回到III
表,因为没有任何东西连接他们(还)
我以前的解决方案最终会产生预先生成的id序列,感觉一般
答案 0 :(得分:0)
如果你产生一个密集的等级怎么办?
首先生成一张包含所需信息的大表。
select foo,
bar,
baz,
dense_rank() over (order by foo) as I_id,
dense_rank() over (order by bar, baz) as III_id,
row_number() over (order by 1) as II_id
from main_Table
然后你只需要用你想要的表格进行转移。
答案 1 :(得分:0)
从“主”表开始,创建两个主要实体,然后使用它们的ID将记录插入到它们之间的“连接表”中,当然可以使用CTE(我假设“主”表I和III在PK列中有default nextval(..)
,从序列汇集下一个ID):
with ins1 as (
insert into tabl1(foo)
values(...)
returning *
), ins3 as (
insert into tabl3(bar, baz)
values (.., ..)
returning *
)
insert into tabl2(i_id, ii_id)
select ins1.id, ins3.id
from ins1, ins3 -- implicit CROSS JOIN here:
-- we assume that only single row was
-- inserted to each "main" table
-- or you need Cartesian product to be inserted to `II`
returning *
;