规范化为postgres中的三个表,包括一个关联表

时间:2017-07-27 00:25:22

标签: sql postgresql

说我有这样的原始数据:

foo     bar    baz    
1        a      b      
1        x      y      
2        z      q

我想最终得到三个表,其中IIII是主表,III和{{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序列,感觉一般

2 个答案:

答案 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 *
;