表A记录是每个车间领用的设备:电子号对应某个车间,号码段是设备编号
表B记录是每个车间领用的设备归还情况:电子号对应某个车间,号码段是设备编号,有可能只归还其中一部分
现在求每个车间的领用设备的归还情况现有两张表,表B的号码段一定在表A的对应号码段里,但是表A的记录在表B里不一定有,表A表B通过五个字段(电子号 规格 型号 起始号码 终止号码)关联
表A
电子号 规格 型号 起始号码 终止号码 领用日期
0001   11   1a9 000001 0000025         2011/01/01
0001   12   1a23 000001 0000025        2011/02/01
0002   12   a90 010010 0200035         2011/03/22
0003   3    390 034040 034065          2011/02/15
表B
电子号 规格 型号 起始号码 终止号码 归还时间
0001   11   1a9  000001 000009        2011/01/02
0001   11   1a9  000010 000024        2011/01/08
0001   11   1a9  000010 000025        2011/01/02
0001   12   1a23 000001 0000025       2011/2/04
0002   12   a90  010010 0200035       2011/3/25
求查询结果:
电子号 规格 型号 起始号码 终止号码 电子号 规格 型号 起始号码 终止号码   领用日期   归还时间
0001    11 1a9  000001 0000025     0001 11 a9 000001 000009      2011/01/01       2011/01/02 
0001    11 1a9  000001 0000025     0001 11 a9 000010 000024      2011/01/01       2011/01/08
0001    11 1a9  000001 0000025     0001 11 a9 000010 000025      2011/01/01       2011/01/02
0001    12 1a23 000001 0000025     0001 12 1a23 000001 0000025   2011/02/01       2011/02/04
0002    12 a90  010010 0200035     0002 12 a90 010010 0200035    2011/03/22       2011/03/25
0003    3  390  034040 034065       null null null null null    2011/02/15         null

解决方案 »

  1.   

    --还在问,你号码段要该怎么处理啊,没必要啊,你表B的号码段一定在表A的对应号码段中,
    --难道下面的结果不是你给出的结果?
    --反正没明白你说的号码段处理该怎么处理
    --你看着办自己修改
    with a as(
    select '0001' 电子号,'11' 规格, '1a9' 型号, '000001' 起始号码, '0000025' 终止号码,'2011/01/01' 领用日期 from dual
    union all
    select '0001', '12', '1a23', '000001', '0000025','2011/02/01' from dual
    union all
    select '0002', '12', 'a90', '010010', '0200035','2011/03/22' from dual
    union all
    select '0003', '3', '390', '034040', '034065','2011/02/15' from dual
    )
    ,
    b as(
    select '0001' 电子号,'11' 规格, '1a9' 型号, '000001' 起始号码, '000009' 终止号码,'2011/01/02' 归还时间 from dual
    union all
    select '0001', '11', '1a9', '000010', '000024','2011/01/08' from dual
    union all
    select '0001', '11', '1a9', '000010', '000025','2011/01/02' from dual
    union all
    select '0001', '12', '1a23', '000001', '000025','2011/2/04' from dual
    union all
    select '0002', '12', 'a90', '010010', '0200035','2011/3/25' from dual
    ) select a.电子号,a.规格,a.型号,a.起始号码,a.终止号码,
           b.电子号,b.规格,b.型号,b.起始号码,b.终止号码,
           a.领用日期,b.归还时间
    from  a,b
    where a.电子号=b.电子号(+)  and a.规格=b.规格(+) and a.型号=b.型号(+)
    order by 1
    电子号 规格 型号 起始号码 终止号码 电子号 规格 型号 起始号码 终止号码 领用日期 归还时间
    0001 11 1a9  000001 0000025 0001 11 1a9  000001 000009  2011/01/01 2011/01/02
    0001 11 1a9  000001 0000025 0001 11 1a9  000010 000024  2011/01/01 2011/01/08
    0001 11 1a9  000001 0000025 0001 11 1a9  000010 000025  2011/01/01 2011/01/02
    0001 12 1a23 000001 0000025 0001 12 1a23 000001 000025  2011/02/01 2011/2/04 
    0002 12 a90  010010 0200035 0002 12 a90  010010 0200035 2011/03/22 2011/3/25 
    0003 3  390  034040 034065                              2011/02/15           
      

  2.   

    想了一下,条件大概这样写:
    a.电子号=b.电子号(+)
    and a.规格=b.规格(+)
    and a.型号=b.型号(+)
    and a.领用时间 <= b.归还时间
    and  (a.起始号码<=b.起始号码 and a.终止号码>=b.终止号码)
      

  3.   

    表记录是这样的话你的查询语句就不正确了,因为存在电子号,规格,型号相同的,号码段不同的记录
    表A
    电子号 规格 型号 起始号码 终止号码 领用日期
    0001 11 1a9 000001 0000025 2011/01/01
    0001 11 1a9 000026 0000050 2011/01/18
    0001 12 1a23 000001 0000025 2011/02/01
    0002 12 a90 010010 0200035 2011/03/22
    0003 3 390 034040 034065 2011/02/15
    表B
    电子号 规格 型号 起始号码 终止号码 归还时间
    0001 11 1a9 000001 000009 2011/01/02
    0001 11 1a9 000010 000024 2011/01/08
    0001 11 1a9 000010 000025 2011/01/02
    0001 11 1a9 000026 0000028 2011/01/20
    0001 11 1a9 000029 0000050 2011/01/24
    0001 12 1a23 000001 0000025 2011/2/04
    0002 12 a90 010010 0200035 2011/3/25
     
      

  4.   


    --这下晓得你说的了,老火的很,你就直接说B表的表号有可能不在A的表号段就OK了嘛 
    --改下就好了嘛
    select a.电子号,a.规格,a.型号,a.起始号码,a.终止号码,
           b.电子号,b.规格,b.型号,b.起始号码,b.终止号码,
           a.领用日期,b.归还时间
    from  a,b
    where a.电子号=b.电子号(+)  and a.规格=b.规格(+) and a.型号=b.型号(+)
    and (Nvl(b.起始号码,a.起始号码)+0 between a.起始号码+0 and a.终止号码+0)
    and (Nvl(b.终止号码,a.终止号码)+0 between a.起始号码+0 and a.终止号码+0)
    order by 1
      

  5.   

    select a.电子号,a.规格,a.型号,a.起始号码,a.终止号码,
           b.电子号,b.规格,b.型号,b.起始号码,b.终止号码,
           a.领用日期,b.归还时间
    from  a,b
    where a.电子号=b.电子号(+)  and a.规格=b.规格(+) and a.型号=b.型号(+)
    and (Nvl(b.起始号码,a.起始号码)+0 between a.起始号码+0 and a.终止号码+0)
    and (Nvl(b.终止号码,a.终止号码)+0 between a.起始号码+0 and a.终止号码+0)
    order by 1
      

  6.   

    来看一下原始数据with a as(
    select '330200000000129286' dzh,'28355' gg, '133021013533' xh, '01034076' qshm, '01034100' zzhm from dual
    union all
    select '330200000000129286', '28355', '133021013533', '03816676', '03816700' from dual
    union all
    select '330200000000129286', '28355', '133021013533', '03927426', '03927450' from dual
    )
    ,
    b as(
    select '330200000000129286' dzh,'28355' gg, '133021013533' xh, '01034076' qshm, '01034100' zzhm from dual
    union all
    select '330200000000129286', '28355', '133021013533', '03816676', '03816700' from dual

    select a.dzh,a.gg,a.xh,a.qshm,a.zzhm,
           b.dzh,b.gg,b.xh,b.qshm,b.zzhm
    from  a,b
    where a.dzh=b.dzh(+)  and a.gg=b.gg(+) and a.xh=b.xh(+)
    and (Nvl(b.qshm,a.qshm)+0 between a.qshm+0 and a.zzhm+0)
    and (Nvl(b.zzhm,a.zzhm)+0 between a.qshm+0 and a.zzhm+0)
    order by 1
    结果就只有两条数据
    电子号 规格 型号 起始号码 终止号码 电子号 规格 型号 起始号码 终止号码 
    330200000000129286 28355 133021013533  01034076 01034100 330200000000129286 28355 133021013533  01034076 01034100 
    330200000000129286 28355 133021013533  03816676 03816700 330200000000129286 28355 133021013533  03816676 03816700
    我希望有三条数据
    电子号 规格 型号 起始号码 终止号码 电子号 规格 型号 起始号码 终止号码 
    330200000000129286 28355 133021013533  01034076 01034100 330200000000129286 28355 133021013533  01034076 01034100 
    330200000000129286 28355 133021013533  03816676 03816700 330200000000129286 28355 133021013533  03816676 03816700
    330200000000129286 28355 133021013533  03927426 03927450 
      

  7.   

    select *
    from a left join b
    on a.电子号=b.电子号 and a.规格=b.规格 and a.型号=b.型号
    and a.起始号码<=b.起始号码 and a.终止号码>=b.终止号码or select *
    from a full join b
    on a.电子号=b.电子号 and a.规格=b.规格 and a.型号=b.型号
    and a.起始号码<=b.起始号码 and a.终止号码>=b.终止号码