本想写清楚些,看来是写的太复杂了,简化以下。呵呵
一个主表对应两个从表,都是一对多:
一个查询结果是:
MATEID           MATENAME MATEMODEL MATEUNIT PLANQTY0101000-000000b   铁1     1          吨         1025
0101000-000000c   铁1     3          吨          820
0501000-000000    水泥1   1          立方米     2050另一个查询结果是:
MATEID          MATENAME MATEMODEL MATEUNIT FACTQTY0101000-000000b 铁1        1         吨       -500
0105000-000000a 铁4        a         吨         20怎样用联合查询出以下结果MATEID          MATENAME MATEMODEL MATEUNIT PLANQTY FACTQTY
0101000-000000b 铁1        1          吨      1025     -500
0101000-000000c 铁1        3          吨       820        0
0105000-000000a 铁4        a          吨         0       20
0501000-000000  水泥1      1          立方米  2050        0oracle只有左连接或者右连接,不知怎样实现

解决方案 »

  1.   

    可以将两个查询的结果合并得到你想要的结果select t1.mateid,t1.matename,t1.matemodel,t1.mateunit,t1.planqty,nvl(t2.factqty,0) from t1,t2
    where t1.mateid=t2.mateid(+)
    union
    select t2.mateid,t2.matename,t2.matemodel,0,t2.factqty
    from t2
    where not exists (select 'x' from t1 where t1.mateid=t2.mateid)
      

  2.   

    not exists :改成外连接更好些
    union: union all
      

  3.   

    16:16:56 jlanzpa817>drop table aa;表已丢弃。已用时间:  00: 00: 00.50
    16:17:13 jlanzpa817>drop table bb;表已丢弃。已用时间:  00: 00: 00.40
    16:17:13 jlanzpa817>
    16:17:13 jlanzpa817>create table aa
    16:17:13   2  (MATEID     varchar2(20),
    16:17:13   3   MATENAME   varchar2(10),
    16:17:13   4   MATEMODEL  varchar2(10),
    16:17:13   5   MATEUNIT   varchar2(10),
    16:17:13   6   PLANQTY    varchar2(10)
    16:17:13   7  );表已创建。已用时间:  00: 00: 00.30
    16:17:13 jlanzpa817>
    16:17:14 jlanzpa817>insert into aa values ('0101000-000000b','铁1','1','吨','1025');
    TABLE
    TABLE已创建 1 行。已用时间:  00: 00: 00.01
    16:17:14 jlanzpa817>insert into aa values ('0101000-000000c','铁1','3','吨','820');已创建 1 行。已用时间:  00: 00: 00.20
    16:17:14 jlanzpa817>insert into aa values ('0501000-000000','水泥1','1','立方米','2050');已创建 1 行。已用时间:  00: 00: 00.10
    16:17:14 jlanzpa817>commit;提交完成。已用时间:  00: 00: 00.20
    16:17:14 jlanzpa817>
    16:17:14 jlanzpa817>create table bb
    16:17:14   2  (MATEID     varchar2(20),
    16:17:14   3   MATENAME   varchar2(10),
    16:17:14   4   MATEMODEL  varchar2(10),
    16:17:14   5   MATEUNIT   varchar2(10),
    16:17:14   6   FACTQTY    varchar2(10)
    16:17:14   7  );表已创建。已用时间:  00: 00: 00.30
    16:17:14 jlanzpa817>insert into bb values ('0101000-000000b','铁1','1','吨','-500');已创建 1 行。已用时间:  00: 00: 00.10
    16:17:15 jlanzpa817>insert into bb values ('0105000-000000a','铁4','a','吨','20');已创建 1 行。已用时间:  00: 00: 00.10
    16:17:15 jlanzpa817>commit;提交完成。已用时间:  00: 00: 00.10
    16:17:15 jlanzpa817>
    16:17:15 jlanzpa817>
    16:17:15 jlanzpa817>select aa.MATEID,aa.MATENAME,aa.MATEMODEL,aa.MATEUNIT,aa.PLANQTY,bb.FACTQTY 
    16:17:15   2  from aa,bb where aa.MATEID = bb.MATEID
    16:17:15   3  union all
    16:17:15   4  select aa.MATEID,aa.MATENAME,aa.MATEMODEL,aa.MATEUNIT,aa.PLANQTY,'0' FACTQTY 
    16:17:15   5  from aa,bb where aa.MATEID = bb.MATEID(+) and bb.MATEID is null
    16:17:15   6  union all
    16:17:15   7  select bb.MATEID,bb.MATENAME,bb.MATEMODEL,bb.MATEUNIT,'0' PLANQTY,bb.FACTQTY 
    16:17:15   8  from aa,bb where aa.MATEID(+) = bb.MATEID and aa.MATEID is null;MATEID               MATENAME   MATEMODEL  MATEUNIT   PLANQTY    FACTQTY
    -------------------- ---------- ---------- ---------- ---------- ----------
    0101000-000000b      铁1        1          吨         1025       -500
    0101000-000000c      铁1        3          吨         820        0
    0501000-000000       水泥1      1          立方米     2050       0
    0105000-000000a      铁4        a          吨         0          20已用时间:  00: 00: 00.20
    16:17:15 jlanzpa817>
    16:17:15 jlanzpa817>
      

  4.   

    jlandzpa(jlandzpa)兄(还是小姐)就是itpub的版主吧?谢谢