我正在尝试找到一种方法来组合2个表和数据透视表。需要注意的是,我正在使用oracle版本9i,它显然没有枢轴功能。所以我希望有一种可以解决这个问题的黑客方式。我有2个表格,格式如下:
人员表:
ID NAME
1 John
2 Steve
3 Bob
4 Gary
电话号码表:
ID TYPE NUMBER
1 1 555-5555
2 1 555-5556
2 2 555-5557
3 2 555-5558
4 5 555-5559
我希望能够按如下方式加入表格:
ID NAME NUMBER_1 NUMBER_2
1 John 555-5555
2 Steve 555-5556 555-5557
3 Bob 555-5558
4 Gary
请注意,有许多不同的TYPE
值,但我只关心1和2.
我现在的解决方案是加入ID
上的表格,并使用TYPE
上的CASE语句条件来生成NUMBER_1
和NUMBER_2
。问题是如果我加入表格,那么史蒂夫会有2行。
答案 0 :(得分:1)
您可以使用conditional aggregation
来模仿pivot
,因为您只关心类型1和2:
select p.id,
p.name,
max(case when pn.type = 1 then pn.number end) number_1,
max(case when pn.type = 2 then pn.number end) number_2
from person p
left join phonenumber pn on p.id = pn.id
and pn.type in (1,2)
group by p.id, p.name
如果需要null
结果,请改用outer join
。 (阅读你的评论,他们是,所以我更新了答案)。如果您不想让没有电话号码的人返回,请将其更改回inner join
。
注意:使用group by
可确保您每人只能获得一行。 conditional aggregation
将允许您返回家庭和手机号码。
根据您对评论的关注,这可以作为子查询包含在内:
select *
from sometable s
join (
select p.id,
p.name,
max(case when pn.type = 1 then pn.number end) number_1,
max(case when pn.type = 2 then pn.number end) number_2
from person p
left join phonenumber pn on p.id = pn.id
and pn.type in (1,2)
group by p.id, p.name
) t on t.id = s.id