如何在oracle中多对多加入

如何在oracle中多对多加入,oracle,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 我怎样才能把这三张桌子连接

我在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来引入表C num1和num2中的列。所以我想让6行都通过ID连接起来,其中的列在output中

我得到了许多重复的行

这是因为在表Band表C中的行之间没有定义1:1关系。因此,查询生成交叉联接

一种选择是使用诸如row_number之类的分析函数来伪造标识符


只要在B和C中每个ID的行数相同,这就行了。如果是这样,您的数据模型可能有问题,但那是另一回事。

根据什么逻辑,您将一个表中的5,9与13,17配对,并分别将6,10与14,18配对?为什么5,9与14,18和6搭配,10与13,17搭配?如果问题本身没有明确定义,那么就不可能编写代码来解决问题。简单地说,这意味着不使用任何代码。根据定义,多对多意味着您将获得多行。此外,您提供的数据与您要求获得的输出之间没有相关性。您需要明确地解释您希望从各个表中获得的数据与您希望得到的结果之间的关系。在解释时,请记住,除了你在帖子中所说的之外,我们对你想做的事情一无所知;我们无法读懂你的心思来了解你想做什么。因此,要明确你期望得到的结果。
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
/