2017-07-27 47 views
0

说我有原始数据,像这样:归为三个表中的Postgres含一个关联表

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

而且我想用三个表,其中IIII是主表和II是落得的关联表I. IIII

E之间。:

I

id  foo 
1   1 
2   2 

II

id  I_id  III_id 
1   1   1 
2   1   2 
3   2   3 

NB即I_ID是串行而不是foo

III

id  bar  baz 
1   a  b 
2   x  y 
3   z  q 

我怎么会去插入此一去?

我打周围的热膨胀系数,但我被困在下面:如果我开始与III,然后返回ID的我不能看我怎样才能回到I表,因为没有任何连接它们(还)

我以前的解决方案已经结束了预先生成身份证序列,感觉马马虎虎

+0

咦?这种新的数据格式对我来说没有意义。你为什么需要II和III? –

+0

@GordonLinoff这里有一些多态现象,我已经抽象了 – salient

回答

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 

然后,你只需要在表中传输你想要的一个独特的。

+0

我认为这基本上是我现在正在做的事情。你将如何抵消抵销'I'和'III'的主键/序列? – salient

+0

是一次性迁移还是常规过程?此方法仅适用于一次迁移。 – Steven

+0

啊是的,这是一个常规的过程。 – salient

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 * 
; 
+0

当'I'中的每行都有'III'多行时,这将如何完成? – salient

+0

这取决于你需要什么。如果你需要保存'I'中的行与'III'中的行之间的所有可能的连接,那么只需使用上面的查询(隐含的'CROSS JOIN',它将产生笛卡尔积,因此对于'N'行一个表和'M'行在第二个它会给你'N * M'连接保存到表'II')。如果你需要一些不同的东西,那么请定义你如何看到这两个表之间的连接,如何将笛卡尔积减少到某种不同的值 - 在'JOIN'中需要一些条件,在这种情况下,你会节省少于N * M'行到'II'。 – Nick

+0

所以,在我的每行中,“III行中的多行”使我觉得'I'中有一行常见行,并且'III'中也有对应的行 - 这应该允许您编写正确的'JOIN'在上面的查询中'ins1'和'ins2'之间。这个“共同点”就是允许说“相应的”。它究竟是什么 - 完全隐藏在你的问题中:) – Nick

相关问题