我在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连接,并且输出中的列。
答案 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
/
只要您在B
和C
中每个ID的行数相同,就可以使用此功能。 (如果这是真的,那么您的数据模型可能存在一些问题,但这是另一回事。)