比较复杂的两查询结果串接?
有若干个table,经过串接后,得到结果A和B
查询A的结果:共9条
DATEA       QTY_next SERIAL MODEL FM_SEQ
20110702 300 P100 90796 610
20110703 25 CNC 90705 610
20110703 300 P099 90785 610
20110704 50 P099 90787 610
20110704 75 P099 90790 610
20110705 100 P099 90785 610
20110705 25 P099 90786 610
20110706 50 P099 90787 610
20110706 25 P099 90788 610
查询B的结果:共4条,最后两条的MODEL中的90785LL、90787LL是A没有的
DATEA        QTY_pre SERIAL MODEL TO_SEQ
20110702 200 P100 90796 400
20110703 40 CNC 90705 400
20110703 600 P099 90785LL 400
20110704 70 P099 90787LL 400希望将A和B串成结果C:共11条
DATEA       QTY_next SERIAL MODEL FM_SEQ    QTY_pre  TO_SEQ
20110702 300 P100 90796 610        200      400  
20110703 25 CNC 90705 610        40       400    
20110703 300 P099 90785 610
20110703                P099    90785LL            600      400
20110704 50 P099 90787 610
20110704 75 P099 90790 610
20110704                P099    90787LL            70       400
20110705 100 P099 90785 610
20110705 25 P099 90786 610
20110706 50 P099 90787 610
20110706 25 P099 90788 610当B的DATEA、SERIAL、MODEL和A相等时,将B的第二例QTY_pre、最后例TO_SEQ插入A右边 
DATEA       QTY_next SERIAL MODEL FM_SEQ    QTY_pre  TO_SEQ
20110702 300 P100 90796 610        200      400  
20110703 25 CNC 90705 610        40       400   
当B的DATEA、SERIAL和A相等时,而MODEL不相等时,即将B的第三、四行的MODEL、QTY_pre、TO_SEQ例插入A中
DATEA       QTY_next SERIAL MODEL FM_SEQ    QTY_pre  TO_SEQ
20110702 300 P100 90796 610        200      400  
20110703 25 CNC 90705 610        40       400    
20110703 300 P099 90785 610
20110703                P099    90785LL            600      400
20110704 50 P099 90787 610
20110704 75 P099 90790 610
20110704                P099    90787LL            70       400
最后希望得到C结果
应该如何写串接的sql语句

解决方案 »

  1.   

    数据量大嘛?
    不大的话,先判断相同,然后在UNION ALL不等部分!
      

  2.   


    ----------------------------------------------------------------
    -- Author  :cosio(day day up)
    -- Date    :2011-10-13 10:00
    -- Verstion:
    ----------------------------------------------------------------
    --> 测试数据:[a][b]
    --> 比较笨的写法.期待高手
    with a as
    (
    select 20110702 DATEA,300 QTY_next, 'P100' SERIAL, '90796' MODEL, 610 FM_SEQ from dual
    union all
    select 20110703,25, 'CNC',  '90705', 610 from dual
    union all
    select 20110703,300, 'P099',  '90785', 610 from dual
    union all
    select 20110704,50, 'P099',  '90787', 610 from dual
    union all
    select 20110704,75, 'P099',  '90790', 610 from dual
    union all
    select 20110705,100, 'P099',  '90785', 610 from dual
    union all
    select 20110705,25, 'P099',  '90786', 610 from dual
    union all
    select 20110706,50, 'P099',  '90787', 610 from dual
    union all
    select 20110706,25, 'P099',  '90788', 610 from dual
    ),
    b as
    (
    select 20110702 DATEA,200 QTY_pre,'P100' SERIAL, '90796' MODEL, 400 TO_SEQ from dual
    union all
    select 20110703, 40, 'CNC', '90705', 400 from dual
    union all
    select 20110703, 600, 'P099', '90785LL', 400 from dual
    union all
    select 20110704, 70, 'P099', '90787LL', 400 from dual
    )
    --SQL:
    select a.DATEA,a.QTY_next,a.SERIAL, a.MODEL,a.FM_SEQ,b.QTY_pre,b.TO_SEQ
     from a,b where a.DATEA=b.datea and a.SERIAL=b.serial and a.MODEL=b.model
     union all
    select DATEA,QTY_next,SERIAL, MODEL,FM_SEQ, 0, 0 from 
    ( select a.DATEA,a.QTY_next,a.SERIAL, a.MODEL,a.FM_SEQ, 0, 0 from a
     union all
     select b.DATEA,b.QTY_pre,b.SERIAL, b.MODEL,b.TO_SEQ, 0, 0 from b)
     where SERIAL not in(select a.SERIAL
     from a,b where a.DATEA=b.datea and a.SERIAL=b.serial and a.MODEL=b.model)
     order by datea--result:
    20110702 300 P100 90796 610 200 400
    20110703 25 CNC 90705 610 40 400
    20110703 300 P099 90785 610 0 0
    20110703 600 P099 90785LL 400 0 0
    20110704 50 P099 90787 610 0 0
    20110704 75 P099 90790 610 0 0
    20110704 70 P099 90787LL 400 0 0
    20110705 100 P099 90785 610 0 0
    20110705 25 P099 90786 610 0 0
    20110706 50 P099 90787 610 0 0
    20110706 25 P099 90788 610 0 0
     
      
      

  3.   

    楼主提供的结果集没有排版,猜着做的WITH A AS (
    SELECT '20110702' DATEA, 300 QTY_NEXT, 'P100' SERIAL, '90796' MODEL, 610 FM_SEQ FROM DUAL UNION ALL
    SELECT '20110703', 25,  'CNC',  '90705', 610 FROM DUAL UNION ALL
    SELECT '20110703', 300, 'P099', '90785', 610 FROM DUAL UNION ALL
    SELECT '20110704', 50,  'P099', '90787', 610 FROM DUAL UNION ALL
    SELECT '20110704', 75,  'P099', '90790', 610 FROM DUAL UNION ALL
    SELECT '20110705', 100, 'P099', '90785', 610 FROM DUAL UNION ALL
    SELECT '20110705', 25,  'P099', '90786', 610 FROM DUAL UNION ALL
    SELECT '20110706', 50,  'P099', '90787', 610 FROM DUAL UNION ALL
    SELECT '20110706', 25,  'P099', '90788', 610 FROM DUAL ),
    B AS (
    SELECT '20110702' DATEA, 200 QTY_PRE, 'P100' SERIAL, '90796' MODEL, 400 TO_SEQ FROM DUAL UNION ALL
    SELECT '20110703', 40,  'CNC',  '90705',   400 FROM DUAL UNION ALL
    SELECT '20110703', 600, 'P099', '90785LL', 400 FROM DUAL UNION ALL
    SELECT '20110704', 70,  'P099', '90787LL', 400 FROM DUAL)
    -- 上面部分是测试用数据,下面部分才是执行的SQL
    SELECT DATEA ,A.QTY_NEXT,SERIAL ,MODEL,A.FM_SEQ,B.QTY_PRE,B.TO_SEQ
     FROM A FULL JOIN B USING(DATEA,SERIAL,MODEL);
    PS:楼主给的分太少了
      

  4.   


    -- 忘记贴执行结果了
    20110702 300 P100 90796 610 200 400
    20110703 25 CNC 90705 610 40 400
    20110703 300 P099 90785 610
    20110704 50 P099 90787 610
    20110704 75 P099 90790 610
    20110705 100 P099 90785 610
    20110705 25 P099 90786 610
    20110706 50 P099 90787 610
    20110706 25 P099 90788 610
    20110703 P099 90785LL 600 400
    20110704 P099 90787LL 70 400