请救一个SQL语句的写法

lixin41658133 2018-03-09 11:17:32
相关表单如下所示:
ID NAME
1 张三
2 李四
3 王五

XUH SUBJECT
1,2 语文
2,3 数学
1,2,3 物理
1,3 英语
1 生物

想实现如下所示:
XUH NAME SUBJECT
1,2 张三,李四 语文
2,3 李四,王五 数学
1,2,3 张三,李四,王五 物理
1,3 张三,王五 英语
1 张三 生物

麻烦指点一下,谢谢!

...全文
931 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
大眼鱼叔叔 2018-03-13
  • 打赏
  • 举报
回复
设计有问题,简单的问题复杂化。不过当作业做还是可以的: select SUBSTR(XUHS, case when POS=1 then 1 else INSTR(XUHS || ',',',',1,POS-1)+1 end, case when POS=1 then INSTR(XUHS || ',',',',1,POS)-1 else INSTR(XUHS || ',',',',1,POS)-INSTR(XUHS || ',',',',1,POS-1)-1 end ) XUH,SUBJECT from (select XUH xuhs,length(XUH)-length(replace(XUH,',',''))+1 NUMS,SUBJECT from T2) a, (select rownum POS from T1) B where B.POS<=a.NUMS order by XUH,SUBJECT;
hhfxl2009 2018-03-12
  • 打赏
  • 举报
回复
引用 4 楼 lixin41658133 的回复:
我的Oracle数据库版本不支持wm_concat这个函数,另外这个instr不行吧?现在我给的示例是1,2,3,可以这样处理。假如是1,12,123这样的序号的话,用instr就有问题了。
如果是9i以下,建议写个函数处理好一点。 如果10G以上,用这个不会有问题了: select xuh, (select wm_concat(name) from t1 where id in (select case when instr(xuh,',')=0 then xuh else regexp_substr(xuh,'[^,]',1,level) end from dual connect by level<=length(xuh)-length(replace(xuh,',',''))+1)) as name,subject from t2
断剑1989 2018-03-12
  • 打赏
  • 举报
回复
引用 4 楼 lixin41658133的回复:
我的Oracle数据库版本不支持wm_concat这个函数,另外这个instr不行吧?现在我给的示例是1,2,3,可以这样处理。假如是1,12,123这样的序号的话,用instr就有问题了。
也不会有问题,wm_contact没有的话可以下载一个包,实在不行只能用行列转换,然后拼接字段咯
lixin41658133 2018-03-12
  • 打赏
  • 举报
回复
我的Oracle数据库版本不支持wm_concat这个函数,另外这个instr不行吧?现在我给的示例是1,2,3,可以这样处理。假如是1,12,123这样的序号的话,用instr就有问题了。
hhfxl2009 2018-03-10
  • 打赏
  • 举报
回复
select xuh,(select wm_concat(name) from t1 where instr(xuh,id)>0) as name,subject from t2
  • 打赏
  • 举报
回复
用逗号分割开,然后做连接,再合并
断剑1989 2018-03-10
  • 打赏
  • 举报
回复
select xuh,wm_concat(name) name, subject from ( select t2.xuh,t1.id,t1.name,t2.subject from t2 join t1 where instr(t2.xuh,t1.id) > 0 order by t1.id) tt group by xuh,subject;

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧