A表:
员工 科室 登记日期
张三 胸外科,皮肤科 2000-11-19
李四 胸外科 2001-01-04
王五 妇产科,骨科 2001-01-08
求一条sql,让其结果如下显示
A表:
员工 科室 登记日期
张三 胸外科 2000-11-19
张三 皮肤科 2000-11-19
李四 胸外科 2001-01-04
王五 妇产科 2001-01-08
王五 骨科 2001-01-08即A表员工属于多个科室的是在一行上用逗号分隔的,现在要把这种形式换成用增加行的形式来解决,属于多个科室就有多行记录
员工 科室 登记日期
张三 胸外科,皮肤科 2000-11-19
李四 胸外科 2001-01-04
王五 妇产科,骨科 2001-01-08
求一条sql,让其结果如下显示
A表:
员工 科室 登记日期
张三 胸外科 2000-11-19
张三 皮肤科 2000-11-19
李四 胸外科 2001-01-04
王五 妇产科 2001-01-08
王五 骨科 2001-01-08即A表员工属于多个科室的是在一行上用逗号分隔的,现在要把这种形式换成用增加行的形式来解决,属于多个科室就有多行记录
解决方案 »
- 【紧急求助】oracle使用export 复合分区dmp文件变大的问题
- 初学问题,oracle中导出表和导出用户和导出表空间有什么区别啊
- 用户创建表不需要权限吗?
- 散分,讨论下跨平台数据库迁移
- [提问]请问loop的结束判定是怎么确定的?
- 这么简单的功能要求,难道只有用动态SQL才能实现吗?
- 老是抱错:ora-12535:TNS:opereation time out
- 通过all_tables可以查到表名,怎么查到相应的列名
- 如何将用Oracle8i创建的数据库从一台机器转移到另一台机器上,详细步骤是什么?谢!
- exp imp 的问题!!!!
- 求助Oracle語句,答案正確馬上結貼
- 初学Oracle,请教个各位老师们个题目,感激不尽
with t1 as
(
select '张三' c1,'胸外科,皮肤科' c2,date'2000-11-19' c3 from dual
union all
select '李四','胸外科',date'2001-01-04' from dual
union all
select '王五','妇产科,骨科',date'2001-01-08' from dual
)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<10) b
where length(c2)-length(replace(c2,','))+1>=b.rn
order by c1,b.rn c1 c2 c3
-----------------------------------------------
1 李四 胸外科 2001/1/4
2 王五 妇产科 2001/1/8
3 王五 骨科 2001/1/8
4 张三 胸外科 2000/11/19
5 张三 皮肤科 2000/11/19
with t1 as
(
select '张三' c1,'胸外科,皮肤科,骨科1,骨科2,骨科3,骨科4,骨科5,骨科6,骨科7,骨科8,骨科9,骨科10,骨科11,骨科12,骨科13,骨科14,骨科15,骨科16,骨科17' c2,date'2000-11-19' c3 from dual
union all
select '李四','胸外科',date'2001-01-04' from dual
union all
select '王五','妇产科,骨科',date'2001-01-08' from dual
)
select DISTINCT c1
,c3
,REPLACE( -- 去除多余的【,】
regexp_substr(c2||',' ,'.*?'||'[,]' ,1 ,LEVEL) -- 截取 ,【科室】,
,',') "科室"
from t1
connect by level <= nvl(
length(regexp_replace(c2,'[^,]','')) + 1
,1)
order by c1;
(
select '张三' c1,'胸外科,皮肤科' c2,date'2000-11-19' c3 from dual
union all
select '李四','胸外科',date'2001-01-04' from dual
union all
select '王五','妇产科,骨科',date'2001-01-08' from dual
)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<10) b
where length(c2)-length(replace(c2,','))+1>=b.rn
order by c1,b.rn c1 c2 c3
-----------------------------------------------
1 李四 胸外科 2001/1/4
2 王五 妇产科 2001/1/8
3 王五 骨科 2001/1/8
4 张三 胸外科 2000/11/19
5 张三 皮肤科 2000/11/19