查看: 5670|回复: 16

[PL/SQL] 【大话IT】oracle如何把单行记录拆分为多行

[复制链接]
论坛徽章:
1
优秀写手
日期:2015-03-04 06:00:13
发表于 2015-2-28 13:00 | 显示全部楼层 |阅读模式
xh         kc
1        语文,数学,英语
2        政治,历史,地理
3        地理,语文
4        地理,数学
把这个拆分为:
1        语文
1        数学
1        英语
2        政治
2        历史
2        地理
4        地理
4        数学
3        地理
3        语文




按照学号,把课程拆分

按照学号,把课程拆分
论坛徽章:
737
季节之章:春
日期:2015-07-31 17:16:29ITPUB季度 技术新星
日期:2014-07-17 14:37:00季节之章:秋
日期:2015-07-31 17:16:14季节之章:夏
日期:2015-07-31 17:16:29股神
日期:2014-10-15 09:23:31衰神
日期:2014-10-20 22:47:12季节之章:冬
日期:2015-07-31 17:16:14红钻
日期:2014-12-16 17:51:41洛杉矶湖人
日期:2016-09-23 08:18:15布鲁克林篮网
日期:2016-09-23 08:17:18
发表于 2015-2-28 13:14 | 显示全部楼层
行列关系转换,有好多帖子参考,search it

使用道具 举报

回复
求职 : 数据库管理员
认证徽章
论坛徽章:
11
ITPUB社区千里马徽章
日期:2013-06-09 10:15:34懒羊羊
日期:2015-03-04 14:52:11懒羊羊
日期:2015-02-10 13:36:05马上有对象
日期:2015-02-02 12:29:02红宝石
日期:2015-01-19 09:44:10马上有车
日期:2014-11-11 14:16:07马上有车
日期:2014-03-27 15:59:39优秀写手
日期:2014-03-12 06:00:13马上有钱
日期:2014-02-18 16:43:092014年新春福章
日期:2014-02-18 16:43:09
发表于 2015-2-28 13:30 | 显示全部楼层
本帖最后由 moseslin 于 2015-2-28 13:31 编辑

WITH t AS (SELECT 1 xh,',语文,数学,英语,' kc FROM dual
UNION ALL SELECT 2,',政治,历史,地理,' FROM dual
UNION ALL SELECT 3,',地理,语文,' FROM dual
UNION ALL SELECT 4,',地理,数学,' FROM dual)
SELECT XH,
       SUBSTR(KC,
              INSTR(KC, ',', 1, LEVEL) + 1,
              INSTR(KC, ',', 1, LEVEL + 1) - INSTR(KC, ',', 1, LEVEL) - 1) KC
  FROM (SELECT XH, KC, LENGTH(KC) - LENGTH(REPLACE(KC, ',')) CN FROM T) TT
CONNECT BY PRIOR XH = XH
       AND LEVEL < CN
       AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL

使用道具 举报

回复
认证徽章
论坛徽章:
32
懒羊羊
日期:2015-03-25 16:16:10ITPUB14周年纪念章
日期:2015-10-26 17:24:11射手座
日期:2015-09-23 08:53:55喜羊羊
日期:2015-06-15 13:04:17暖羊羊
日期:2015-05-21 16:12:35沸羊羊
日期:2015-05-07 17:25:26暖羊羊
日期:2015-05-21 16:12:35暖羊羊
日期:2015-05-21 16:12:35慢羊羊
日期:2015-04-21 17:07:36慢羊羊
日期:2015-03-25 09:38:59
发表于 2015-2-28 14:03 | 显示全部楼层
select  xh,REGEXP_SUBSTR(kc,'[^,]+',1,L) AS kc FROM T,
    (SELECT LEVEL L FROM DUAL CONNECT BY  LEVEL<=100)
WHERE L<=LENGTH(kc) -LENGTH(REPLACE(kc,','))-1
ORDER BY xh,kc;

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2015-03-04 06:00:13
 楼主| 发表于 2015-2-28 14:36 | 显示全部楼层
moseslin 发表于 2015-2-28 13:30
WITH t AS (SELECT 1 xh,',语文,数学,英语,' kc FROM dual
UNION ALL SELECT 2,',政治,历史,地理,' FROM d ...

这个可以,有更通用的么?

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2015-03-04 06:00:13
 楼主| 发表于 2015-2-28 14:45 | 显示全部楼层
iyee_tu 发表于 2015-2-28 14:03
select  xh,REGEXP_SUBSTR(kc,'[^,]+',1,L) AS kc FROM T,
    (SELECT LEVEL L FROM DUAL CONNECT BY  LE ...

最后不能减-1
select  xh,REGEXP_SUBSTR(kc,'[^,]+',1,L) AS kc FROM T,
    (SELECT LEVEL L FROM DUAL CONNECT BY  LEVEL<=100)
WHERE L<=LENGTH(kc) -LENGTH(REPLACE(kc,','))
ORDER BY xh,kc;

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2015-03-04 06:00:13
 楼主| 发表于 2015-2-28 14:46 | 显示全部楼层
iyee_tu 发表于 2015-2-28 14:03
select  xh,REGEXP_SUBSTR(kc,'[^,]+',1,L) AS kc FROM T,
    (SELECT LEVEL L FROM DUAL CONNECT BY  LE ...

最后的减1 不要
select  xh,REGEXP_SUBSTR(kc,'[^,]+',1,L) AS kc FROM T,
    (SELECT LEVEL L FROM DUAL CONNECT BY  LEVEL<=100)
WHERE L<=LENGTH(kc) -LENGTH(REPLACE(kc,','))-1
ORDER BY xh,kc;

使用道具 举报

回复
求职 : 数据库开发
认证徽章
论坛徽章:
41
2017金鸡报晓
日期:2017-02-08 14:09:13秀才
日期:2016-01-13 12:14:26秀才
日期:2016-01-12 11:23:27金牛座
日期:2016-01-03 20:58:56秀才
日期:2015-12-21 09:53:46秀才
日期:2015-12-21 09:48:11秀才
日期:2015-12-18 09:28:57秀才
日期:2015-12-14 15:02:13秀才
日期:2015-11-23 09:48:22秀才
日期:2016-01-21 13:37:04
发表于 2015-2-28 14:47 | 显示全部楼层

ask

本帖最后由 Skye_to_Skye 于 2015-2-28 14:49 编辑

with a as (
select         '2' num        ,'政治' name from dual union all
select        '2'        num        ,'历史' name from dual union all
select        '3'        num        ,'地理' name from dual union all
select        '3'        num        ,'数学' name from dual union all
select         '1'        num        ,'语文' name from dual union all
select        '1'        num        ,'数学' name from dual union all
select        '2'        num        ,'数学' name from dual)

使用道具 举报

回复
论坛徽章:
737
季节之章:春
日期:2015-07-31 17:16:29ITPUB季度 技术新星
日期:2014-07-17 14:37:00季节之章:秋
日期:2015-07-31 17:16:14季节之章:夏
日期:2015-07-31 17:16:29股神
日期:2014-10-15 09:23:31衰神
日期:2014-10-20 22:47:12季节之章:冬
日期:2015-07-31 17:16:14红钻
日期:2014-12-16 17:51:41洛杉矶湖人
日期:2016-09-23 08:18:15布鲁克林篮网
日期:2016-09-23 08:17:18
发表于 2015-2-28 14:56 | 显示全部楼层
iyee_tu 发表于 2015-2-28 14:03
select  xh,REGEXP_SUBSTR(kc,'[^,]+',1,L) AS kc FROM T,
    (SELECT LEVEL L FROM DUAL CONNECT BY  LE ...

SELECT XH, REGEXP_SUBSTR(KC, '[^,]+', 1, LEVEL) AS KC
  FROM T
CONNECT BY PRIOR XH = XH
       AND LEVEL <= REGEXP_COUNT(KC, ',') + 1
       AND PRIOR DBMS_RANDOM.VALUE > 0;

使用道具 举报

回复
求职 : 数据库开发
认证徽章
论坛徽章:
41
2017金鸡报晓
日期:2017-02-08 14:09:13秀才
日期:2016-01-13 12:14:26秀才
日期:2016-01-12 11:23:27金牛座
日期:2016-01-03 20:58:56秀才
日期:2015-12-21 09:53:46秀才
日期:2015-12-21 09:48:11秀才
日期:2015-12-18 09:28:57秀才
日期:2015-12-14 15:02:13秀才
日期:2015-11-23 09:48:22秀才
日期:2016-01-21 13:37:04
发表于 2015-2-28 15:28 | 显示全部楼层
moseslin 发表于 2015-2-28 13:30
WITH t AS (SELECT 1 xh,',语文,数学,英语,' kc FROM dual
UNION ALL SELECT 2,',政治,历史,地理,' FROM d ...

REGEXP_SUBSTR(kc,'[^,]+',1,2)这个没怎么看懂唉,能解释下不?

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

大会官网>>
TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表