DIAGNOSIS_ARRAY 是字典表
01 临床诊断 1
02 病理诊断 1
03 影像诊断 1
04 合并症或并发症诊断 1
05 其它诊断 1
06 主要手术诊断 2
07 其他手术诊断 2这是一张关联表 这里关联字典表
010G111EH190396 372927197301110040 13327057 85.240 06
010G111EH190396 372927197301110040 13327057 85.240 06|07
010G111EH190393 110103195210280040 39698319 01. 06求一条sql语句 关联表关联字典表该怎么写?
01 临床诊断 1
02 病理诊断 1
03 影像诊断 1
04 合并症或并发症诊断 1
05 其它诊断 1
06 主要手术诊断 2
07 其他手术诊断 2这是一张关联表 这里关联字典表
010G111EH190396 372927197301110040 13327057 85.240 06
010G111EH190396 372927197301110040 13327057 85.240 06|07
010G111EH190393 110103195210280040 39698319 01. 06求一条sql语句 关联表关联字典表该怎么写?
-- Create table
create table DIAGNOSIS_ARRAY
(
diagnosistype VARCHAR2(2),
diagnosisname VARCHAR2(20),
type VARCHAR2(2)
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64
minextents 1
maxextents unlimited
);
-- Add comments to the columns
comment on column DIAGNOSIS_ARRAY.diagnosistype
is '诊断类型代码';
comment on column DIAGNOSIS_ARRAY.diagnosisname
is '诊断类型数组';
comment on column DIAGNOSIS_ARRAY.type
is '类型 1为西医诊断,2为手术诊断';-- Create table
create table LP_OPERATIONCODE_ARRAY
(
bdh VARCHAR2(20),
pid VARCHAR2(20),
v_sjbh VARCHAR2(10),
operationcode VARCHAR2(10),
diagnosistype VARCHAR2(10)
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64
minextents 1
maxextents unlimited
);
1、单行拆分为多行
借用一楼之前加答过的关于拆分的代码,稍微做了些调整,不再写死最大ROWNUM,
改为记录中允许的最大ROWNUM := NVL(LENGTH(regexp_replace(c2,'[^,]')),0)
2、关联字典表
3、关联后多行再次拼装为单行
使用WM_CONCAT再次组装,然后GROUP BY ,其实DISTINCT也行。
不论用哪个,查询效率就很低了
*/
WITH t1 AS
( SELECT '张三' c1,'01,02,05' c2,DATE'2000-11-19' c3 FROM dual
UNION ALL
SELECT '李四','07',DATE'2001-01-04' FROM dual
UNION ALL
SELECT '王五','04,05',DATE'2001-01-08' FROM dual
),
t2 as (
select '01' as fcode, '临床诊断' as fname, 1 as ftype from dual
union all
select '02', '病理诊断', 1 from dual
union all
select '03', '影像诊断', 1 from dual
union all
select '04', '合并症或并发症诊断', 1 from dual
union all
select '05', '其它诊断', 1 from dual
union all
select '06', '主要手术诊断', 2 from dual
union all
select '07', '其他手术诊断', 2 from dual
)
select c1,c3,cc from (
select c1,c3,wm_concat(fname) over(partition by c1,c3 order by c1,c3) cc from (
select * from (
SELECT c1,
substr(','
||c2
||',',instr(','
||c2,',',1,b.rn) +1, instr(c2
||',',',',1,b.rn)-instr(','
||c2,',',1,b.rn)) c2,
c3
FROM t1,
(SELECT rownum rn
FROM t1 connect BY rownum < NVL(LENGTH(regexp_replace(c2,'[^,]')),0)
) b
WHERE LENGTH(c2)-LENGTH(REPLACE(c2,','))+1>=b.rn
ORDER BY c1,
b.rn) a ,t2
where a.c2 = t2.fcode
)
) group by c1,c3,ccC1 C3 CC
------ ------------------------- -----------------------
李四 2001-01-04 00:00:00 其他手术诊断
王五 2001-01-08 00:00:00 其它诊断,合并症或并发症诊断
张三 2000-11-19 00:00:00 其它诊断,病理诊断,临床诊断
select 要选取的字段 from DIAGNOSIS_ARRAY d,LP_OPERATIONCODE_ARRAY l where d.diagnosistype=l.diagnosistype;