比较复杂的两查询结果串接?
有若干个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语句
有若干个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语句
不大的话,先判断相同,然后在UNION ALL不等部分!
----------------------------------------------------------------
-- 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
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:楼主给的分太少了
-- 忘记贴执行结果了
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