报价表 
              ID  产品  区域ID    价格
               1   A     s1        32
             2   A     s2        32
             3   A     s3        48
             4   A     s5        11
             
             
             区域表
             区域ID   区域      区域等级
               s1       北京      1
             s2       北京朝阳  2
             s3       北京东城  2
             s4       天津      1
             s5       天津南城  2 
             
             
             需要显示成:
              ID  产品  区域ID   区域名称   区域等级      价格
                1   A     s1       北京           1          32
              4   A     s5       天津南城       2          11    要求:报价表如果存在一级区域时,那么二级区域就不需要显示了.
     如果只有二级区域的数据,没有一级区域,那么二级区域还需显示出来.
    

解决方案 »

  1.   

    你的表区域区分没有,没办法分地区,我现只能帮你通过名字前两位来区分select aa.id ,aa.产品  aa.区域ID  aa.区域名称  aa.区域等级      aa.价格 from(
    select a.id,a.产品,a.区域ID,a.价格,b.区域,b. 区域等级 ,
           ,row_number() over (partition by substr(区域,1,2) order by b.区域等级) rn
          from 报价表  a,区域表 b
           where a.区域ID=b.区域ID) aa
    where aa.rn=1你的区域表应该做树型结构,表明上下级区域的关系
      

  2.   

    sorry , hebo2005 ,我在区域表少了一个字段,现在加上.            报价表 
                  ID  产品  区域ID    价格 
                  1  A    s1        32 
                2  A    s2        32 
                3  A    s3        48 
                4  A    s5        11 
                
                
                区域表 
                区域ID  区域      区域等级   父区域ID
                  s1      北京      1    null 
                s2      北京朝阳  2      s1
                s3      北京东城  2      s1
                s4      天津      1      null
                s5      天津南城  2      s4
                
                
                需要显示成: 
                  ID  产品  区域ID  区域名称  区域等级      价格 
                    1  A    s1      北京          1          32 
                  4  A    s5      天津南城      2          11     要求:报价表如果存在一级区域时,那么二级区域就不需要显示了. 
         如果只有二级区域的数据,没有一级区域,那么二级区域还需显示出来.
      

  3.   

    with b as
    (
     select  's1' area_id,     '北京' area , 1   lv,null  pri_id from dual
     union all
     select  's2',      '北京朝阳',  2    ,  's1' from dual
     union all
     select 
     
                's3',      '北京东城',  2   ,   's1' from dual
     union all
     select 
     
                's4',      '天津',      1      ,null from dual
     union all
     select 
     
                's5',      '天津南城',  2     , 's4' from dual
     
      ),
      a as
      (
      select 1 id,  'A' pro_id,    's1' area_id,        32  price from dual
      union all
      select 
                2 , 'A'    ,'s2',        32 from dual
      union all
      select 
                3 , 'A',    's3',        48 from dual
      union all
      select 
                4 , 'A'    ,'s5',        11 from dual
     
      )
        SELECT ID,pro_id, area_id, area, lv, price
      FROM (SELECT a.ID,a.pro_id,a.area_id,b.area,b.lv,a.price,
                   ROW_NUMBER () OVER (PARTITION BY b.area_group ORDER BY lv,
                    b.area_id) rn
              FROM a,
                   (SELECT bb.*,
                           SUBSTR (area_name,
                                   2,
                                   DECODE (INSTR (area_name, ',', 2),
                                           0, LENGTH (area_name),
                                           INSTR (area_name, ',', 2) - 2
                                          )
                                  ) area_group
                      FROM (SELECT     b.*,
                                       SYS_CONNECT_BY_PATH (area, ',') area_name
                                  FROM b
                            START WITH lv = 1
                            CONNECT BY PRIOR area_id = pri_id) bb) b
             WHERE a.area_id = b.area_id)
     WHERE rn = 1
     结果
    Row# ID PRO_ID AREA_ID AREA LV PRICE1 1 A s1 北京 1 32
    2 4 A s5 天津南城 2 11
    我把字段名全换成英文的,测试起来方便
      

  4.   

    SELECT ID,pro_id  产品, area_id 区域ID, area 区域, lv 区域等级, price 价格 
      FROM (SELECT a.ID,a.pro_id,a.area_id,b.area,b.lv,a.price,
                   ROW_NUMBER () OVER (PARTITION BY b.area_group ORDER BY lv,
                    b.area_id) rn
              FROM a,
                   (SELECT bb.*,
                           SUBSTR (area_name,
                                   2,
                                   DECODE (INSTR (area_name, ',', 2),
                                           0, LENGTH (area_name),
                                           INSTR (area_name, ',', 2) - 2
                                          )
                                  ) area_group
                      FROM (SELECT     b.*,
                                       SYS_CONNECT_BY_PATH (area, ',') area_name
                                  FROM b
                            START WITH lv = 1
                            CONNECT BY PRIOR area_id = pri_id) bb) b
             WHERE a.area_id = b.area_id)
     WHERE rn = 1结果
    Row# ID 产品 区域ID 区域 区域等级 价格1 1 A s1 北京 1 32
    2 4 A s5 天津南城 2 11
      

  5.   

    a表对应你的报价表
    a as 
      ( 
      select 1 id,  'A' pro_id,    's1' area_id,        32  price from dual 
      union all 
      select 
                2 , 'A'    ,'s2',        32 from dual 
      union all 
      select 
                3 , 'A',    's3',        48 from dual 
      union all 
      select 
                4 , 'A'    ,'s5',        11 from dual   ) 
    b 表对应你的 区域表 with b as 

    select  's1' area_id,    '北京' area , 1   lv,null  pri_id from dual 
    union all 
    select  's2',      '北京朝阳',  2    ,  's1' from dual 
    union all 
    select             's3',      '北京东城',  2  ,  's1' from dual 
    union all 
    select             's4',      '天津',      1      ,null from dual 
    union all 
    select             's5',      '天津南城',  2    , 's4' from dual   )
    你自己做字段转换吧
    建议贴测试数据最好就是英文,并且最好和你真实字段名一样,这样测试起来方便
    用中文名实在不方便