有个需求是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的参数。