2017-06-30 16 views
-4

加入我在Oracle中这些表怎么办多对多在Oracle

表A

ID GROUP NUMBER1 
1 CAT1 0.4 
2 CAT2 0.5 

表B

ID VALUE1 VALUE2 
1 5   9 
1 6   10 
2 7   11 
2 8   12 

表C

ID NUM1 NUM2 
1 13  17 
1 14  18 
2 15  19 
2 16  20 

如何我可以加入所有三张牌桌吗?看起来像这样?

ID GRUP NUMBER1 VALUE1 VALUE2 NUM1 NUM2 
1 CAT1  0.4  5  9  13 17 
1 CAT1  0.4  6  10  14 18 
2 CAT2  0.5  7  11  15 19 
2 CAT2  0.5  8  12  16 20 

目前我做

select group, number1, value1, value2, num2, num2 
from tablea a inner join tableb b inner join a.id = b.id 
inner join tablec inner join c.id = a.id 

和我得到许多重复的行。

当我将表A连接到表B时,我得到6行。那很好。我内心加入这些表上的ID。

现在我只想仍然有6行,但我想通过再次加入ID在TABLE C num1和num2中引入列。所以我想要有6行全部通过ID与输出中的列连接。

+5

通过什么逻辑将一个表与另一个表中的(13,17)配对(5,9),并将它们分开(6,10)和(14,18)?为什么不(5,9)与(14,18)和(6,10)配对(13,17)?如果问题本身没有明确的定义(这意味着,**以简单的英语**,不需要任何代码)就不可能编写代码来解决问题。 – mathguy

+1

*多对多*根据定义意味着您将获得*许多多行*。另外,您提供的数据与您要求获得的输出之间没有关联。你需要用精确的术语清楚地解释*你希望数据从单个表格得到的结果到你要求得到的结果。在解释时,请记住,我们知道*除了您在帖子中说的内容外*您绝对没有*想要做什么;我们无法弄清楚你想要做什么。所以**要具体清楚**你期望如何得到结果。 –

回答

1

“我收到许多重复的行”

这是因为你没有定义1:表B和表C行之间1的关系。所以你的查询生成一个交叉连接。

一种选择是使用分析函数(如row_number())伪造标识符。

select a.group, a.number1, b.value1, b.value2, c.num2, c.num2 
from tablea a 
    inner join (select id, value1, value2 
         , row_number() over (partition by id order by value1) rn 
        from tableb ) b 
       on a.id = b.id 
    inner join (select id, num1, num2 
         , row_number() over (partition by id order by num1) rn 
        from tablec) c 
      on a.id = c.id 
where b.rn = c.rn 
/

这只要你有BC相同的每ID行的工作。 (如果这是真的,那么您的数据模型可能存在一些问题,但这是另一回事。)