请教oracle10g中,
有两张表,其中一张表A(a,a1,a2,a3,a4,a5),另一张表B(a,a1,a2,a3)中的字段在A中都有,
如何实现查询A表中的结果,若B表中有与A表某个字段a相同的记录,则显示B表中的字段,
如果在B中没有与A表中这个字段相同的记录则显示A中自有的字段?
即B表中的数据有优先显示的权限。

解决方案 »

  1.   

    select A.a,nvl(B.a1,A.a1),nvl(B.a2,A.a2),nvl(B.a3,A.a3),A.a4,A.a5 from A,B
    where A.a=B.a(+);
      

  2.   

    create table A(a varchar(10),a1 number(20),a2 number(20),a3 number(20),
    a4 number(20),a5 number(20)); 
    create table B(a varchar(10),a1 number(20),a2 number(20),a3 number(20)); 
    select * from A;
    select * from B;
    select A.a,nvl(B.a1,A.a1),nvl(B.a2,A.a2),nvl(B.a3,A.a3),A.a4,A.a5 from A,B 
    where A.a=B.a(+);
      

  3.   

    很感谢各位的热心帮忙,可是用这种方法如果B表中的某条记录有对应的,但是有空字段,对应要替换的字段还是会显示A表的值。例如:
    insert into A(a,a1,a2)values(1,112,222);
    insert into B(a,a1)values(1,117);
    结果会显示:1,117,222
    需要显示:1,117,空
      

  4.   

    select a,a1,a2,a3,'' a4,'' a5 from B 
    union all
    select a,a1,a2,a3,a4,a5 from A where not exists (select null from B where A.a=B.a)
      

  5.   

    这样满足你的需求?前提是两个表的字段你都知道
    SELECT B.a,B.a1,B.a2,B.a3,A.a4,A.a5 
    from A,B 
    where A.a=B.a(+)
    UNION
    SELECT A.a,A.a1,A.a2,A.a3,A.a4,A.a5
    FROM A,B 
    where A.a NOT IN (SELECT DISTINCT B.a FROM B)
      

  6.   

    自己写了一个,看着不舒服,高手帮忙优化一下。
    select t.*,A.a4,A.a5 from
    (select a,a1,a2,a3 from A where A.a not in(select A.a from A,B where A.a=B.a)
    union
    select a,a1,a2,a3 from B where B.a in(select A.a from A,B where A.a=B.a)) t,A
    where t.a=A.a
      

  7.   

    select A.a,nvl(B.a1,A.a1),nvl(B.a2,A.a2),nvl(B.a3,A.a3),A.a4,A.a5 from A a full join B b 
    on a.a1=b.a1 and a.a2=b.a2