表TABLEA
CREATE TABLE TABLEA
(
OID INT,
ZONE_CODE VARCHAR2(30)
)
TABLEA的数据
insert into TABLEA(OID,ZONE_CODE) VALUES (1,'04,01,02');
insert into TABLEA(OID,ZONE_CODE) VALUES (2,'04,03,02');
insert into TABLEA(OID,ZONE_CODE) VALUES (3,'04');
表TABLEB
CREATE TABLE TABLEB
(
OID INT,
ZONE_CODE VARCHAR2(2),
ZONE_NAME VARCHAR2(30)
)
TABLEB数据
insert into TABLEB(OID,ZONE_CODE,ZONE_NAME) VALUES (5,'04','1号货站');
insert into TABLEB(OID,ZONE_CODE,ZONE_NAME) VALUES (1,'01','中区');
insert into TABLEB(OID,ZONE_CODE,ZONE_NAME) VALUES (2,'02','北区');
insert into TABLEB(OID,ZONE_CODE,ZONE_NAME) VALUES (3,'03','南区');
insert into TABLEB(OID,ZONE_CODE,ZONE_NAME) VALUES (6,'08','东北区');
想要的结果是:
查询TABLEA表得到如下数据:
OID ZONE_CODE
1 04-1号货站,01-中区,02-北区
2 04-1号货站,03-南区,02-北区
3 04-1号货站
这种结果的Oracle 要怎么实现?
------解决思路----------------------
--data '01,02,01,03,02' '03,02'
--result 01-aa,02-bb,01-aa,03-cc,02-bb 03-cc,02-bb
with tb1 as
(select 1 id, '01,02,01,03,02' cd
from dual
union all
select 2, '03,02'
from dual),
tb2 as
(select '01' cd, 'aa' nm
from dual
union all
select '02' cd, 'bb' nm
from dual
union all
select '03' cd, 'cc' nm
from dual)
SELECT T3.ID,
LTRIM(MAX(SYS_CONNECT_BY_PATH(t3.cd
------解决思路----------------------
'-'
------解决思路----------------------
T3.NM, ',')), ',')
from (select tb2.cd,
tb2.nm,
t1.id,
rnum,
ROW_NUMBER() OVER(PARTITION BY T1.RNUM ORDER BY lv) RN
from (SELECT t.*,
REGEXP_SUBSTR(T.cd, '[^,]+', 1, LEVEL) STR,
level lv
FROM (SELECT t.*, ROWNUM RNUM FROM TB1 T) T
CONNECT BY LEVEL <= regexp_count(t.cd, ',') + 1
AND PRIOR RNUM = RNUM
AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL) t1,
tb2
where t1.str = tb2.cd) t3
START WITH T3.RN = 1
CONNECT BY PRIOR rn = rn - 1
AND PRIOR T3.RNUM = T3.RNUM
GROUP BY T3.RNUM, T3.ID;
------解决思路----------------------
SELECT OID,(
SELECT wm_concat(b.zone_code
------解决思路----------------------
'-'
------解决思路----------------------
b.zone_name) FROM tableb b WHERE ','
------解决思路----------------------
a.zone_code
------解决思路----------------------
',' LIKE '%,'
------解决思路----------------------
b.zone_code
------解决思路----------------------
',%'
)zone_name
FROM tablea a;
------解决思路----------------------
11g可以考虑使用listagg