如何做多对多加入oracle

时间:2017-06-30 22:38:35

标签: 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行,但是我想再次通过JOINING引入TABLE C num1和num2中的列。所以我希望有6行全部通过ID连接,并且输出中的列。

1 个答案:

答案 0 :(得分:1)

  

"我得到了许多重复的行"

这是因为表B和表C中的行之间没有定义的1: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的行数相同,就可以使用此功能。 (如果这是真的,那么您的数据模型可能存在一些问题,但这是另一回事。)