请问一个全链接的有关问题,如果右表有多行与左表id相同,怎么将左表重复的行显示为空

请教一个全链接的问题,如果右表有多行与左表id相同,如何将左表重复的行显示为空
本帖最后由 ealff007 于 2014-11-19 09:31:19 编辑
请教一个全链接的问题,如果右表有多行与左表id相同,如何将左表重复的行显示为空?
例如下面:
       a1表的数据
id vdef2 vdef3
a 1           1
a 1           2
a 2           1
a 2           2
a 2           3
b 1           1

a2表的数据
id vdef5 vdef6
a 1           1
a 1            2
a 1            3
a 1            4
a 2            1
a 2            2
b 1            1
b 1            2

想要实现的效果如下:
请问一个全链接的有关问题,如果右表有多行与左表id相同,怎么将左表重复的行显示为空

试着用全链接来写,但是有很多重复的行,想要将重复的行显示为空,如何处理?
insert into a1 values('a','1','1');
insert into a1 values('a','1','2');
insert into a1 values('a','2','1');
insert into a1 values('a','2','2');
insert into a1 values('a','2','3');
insert into a1 values('b','1','1');
insert into a2 values('a','1','1');
insert into a2 values('a','1','2');
insert into a2 values('a','1','3');
insert into a2 values('a','1','4');
insert into a2 values('a','2','1');
insert into a2 values('a','2','2');
insert into a2 values('b','1','1');
insert into a2 values('b','1','2');

select a1.id, a1.vdef2, a1.vdef3, a2.id, a2.vdef5, a2.vdef6
  from a1
  full outer join a2 on a1.id = a2.id
                    and a1.vdef2 = a2.vdef5
 order by a1.id, a1.vdef2, a1.vdef3

最后这样实现的效果左表和右表都会出现重复的数据,不需要重复的数据,想要重复的数据显示为空,如何处理?
请问一个全链接的有关问题,如果右表有多行与左表id相同,怎么将左表重复的行显示为空
------解决思路----------------------
select NVL(T1.id,T2.id) id,T1.vdef2,T1.vdef3, T2.vdef5, T2.vdef6
from(
select id,vdef2,vdef3,row_number()over(partition by id,vdef2 order by vdef3) rn
from a1) T1 full outer join (
select id,vdef5,vdef6,row_number()over(partition by id,vdef5 order by vdef6) rn
from a2) T2
on T1.id = T2.id
and T1.vdef2 = T2.vdef5
AND T1.RN=T2.RN
order by NVL(T1.id,T2.id),NVL(T1.vdef2,T2.vdef5),NVL(T1.rn,T2.rn)

------解决思路----------------------
引用:



select nvl(a1.id,a2.id), a1.vdef2, a1.vdef3, a2.vdef5, a2.vdef6
  from a1
  full outer join a2
    on a1.id = a2.id
   and a1.vdef2 = a2.vdef5
   and a1.vdef3 = a2.vdef6
 order by nvl(a1.id,a2.id), a1.vdef2, a1.vdef3

------解决思路----------------------
引用:
select NVL(T1.id,T2.id) id,T1.vdef2,T1.vdef3, T2.vdef5, T2.vdef6
from(
select id,vdef2,vdef3,row_number()over(partition by id,vdef2 order by vdef3) rn
from a1) T1 full outer join (
select id,vdef5,vdef6,row_number()over(partition by id,vdef5 order by vdef6) rn
from a2) T2
on T1.id = T2.id
and T1.vdef2 = T2.vdef5
AND T1.RN=T2.RN
order by NVL(T1.id,T2.id),NVL(T1.vdef2,T2.vdef5),NVL(T1.rn,T2.rn)


正解