报价表
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 要求:报价表如果存在一级区域时,那么二级区域就不需要显示了.
如果只有二级区域的数据,没有一级区域,那么二级区域还需显示出来.
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 要求:报价表如果存在一级区域时,那么二级区域就不需要显示了.
如果只有二级区域的数据,没有一级区域,那么二级区域还需显示出来.
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你的区域表应该做树型结构,表明上下级区域的关系
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 要求:报价表如果存在一级区域时,那么二级区域就不需要显示了.
如果只有二级区域的数据,没有一级区域,那么二级区域还需显示出来.
(
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
我把字段名全换成英文的,测试起来方便
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
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 )
你自己做字段转换吧
建议贴测试数据最好就是英文,并且最好和你真实字段名一样,这样测试起来方便
用中文名实在不方便