oracle多表做full join以及COALESCE用法


      有个需求是3张表做full join ,拼凑成一张表,测试表分别为p1,p2,p3,其中3个表根据F1列做full join, 测试数据如下:

   select * from p1;
   
   F1 A1 A2 A3
   1 1 1
   2 2 2 2
   3  
   
   select * from p2;
   F1 B1 B2 B3
   a 2 2
   b 45332  b2
   c 12 3 33
   1 100 200
   
   select * from p3;
   F1 C1 C2 C3
   1 300  c1
   a 400  a1
   x1 32 33 43
   x2 32 33 3

根据F1列做full join,理想的结果如下:
  F A1 A2 A3 B1 B2 B3 C1 C2 C3
 1 1 1  100 200  300  c1
 3         
 2 2 2 2      
 b    45332  b2   
 c    12 3 33   
 a    2 2  400  a1
 x1       32 33 43
 x2       32 33 3
 

有2种sql的写法:

select nvl(nvl(a.f1, b.f1),c.f1) as f , a.a1,a.a2,a.a3, b.b1,b.b2,b.b3, c.c1,c.c2,c.c3
  from p1 a
  full join p2 b 
    on a.f1 = b.f1
full join p3 c on a.f1 = c.f1 or b.f1=c.f1

 

select COALESCE(a.f1,b.f1,c.f1) as f ,  a.a1,a.a2,a.a3, b.b1,b.b2,b.b3, c.c1,c.c2,c.c3
  from p1 a
  full join p2 b  on a.f1 = b.f1
full join p3 c on COALESCE(a.f1, b.f1)=c.f1

第二种写法更加简单明了,COALESCE的用法是精髓啊,哈哈。

coalesce(参数1,参数2,参数3,....) , 是取第一个不为null的参数。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值