oracle数据库一个表字段中存了id,并以逗号分隔,id对应的详细信息在另一个表中

MooreMe 2015-11-05 02:39:08


我看到了一个类似的问题,不解答的不是Oracle

现在有两个表,表a中

aid 主管领导
1 1,2,3
2 2,4

表b中

bid 姓名
1 李一
2 刘二
3 张三
4 李四

怎么联合查询出
序号 主管领导 主管领导姓名
1 1,2,3 李一,刘二,张三
2 2,4 刘二,李四

求救!!!!
...全文
5732 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
kkkkk0lllll 2019-10-12
  • 打赏
  • 举报
回复
引用 14 楼 freedom97 的回复:
研究了一下啊上午被后面的‘,’迷惑了 写成这样是不是清晰了很多? select aid, 主管领导, (select listagg(b.姓名, ',') within group(order by bid) from b where instr( a.主管领导, b.bid ) > 0) 主管领导姓名 from a select aid, 主管领导, (select listagg(b.姓名, ',') within group(order by bid) from b where a.主管领导 like ‘%’||b.bid||'%' > 0) 主管领导姓名 from a
不带分割符号,模糊匹配很容易引起匹配出错,如 123,23,230,都能匹配上%23%
AHUA1001 2019-10-08
  • 打赏
  • 举报
回复
很简单,直接执行以下语句即可。 WITH A AS ( SELECT '1' AID,'1,2,3' 主管领导 FROM DUAL UNION ALL SELECT '2' AID,'2,4' 主管领导 FROM DUAL), B AS ( SELECT '1' BID,'李一' 姓名 FROM DUAL UNION ALL SELECT '2' BID,'刘二' 姓名 FROM DUAL UNION ALL SELECT '3' BID,'张三' 姓名 FROM DUAL UNION ALL SELECT '4' BID,'李四' 姓名 FROM DUAL ) SELECT A.AID 序号,A.主管领导,LISTAGG(B.姓名,',') WITHIN GROUP (ORDER BY B.BID) 主管领导姓名 FROM A LEFT JOIN B ON INSTR(','||A.主管领导||',',','||B.BID||',') > 0 GROUP BY A.AID,A.主管领导 ;
陌然回首7 2019-10-08
  • 打赏
  • 举报
回复
求支援!!!!!!!我也碰到了
米花bug 2018-01-09
  • 打赏
  • 举报
回复
引用 2 楼 liuzhe_521 的回复:
select aid, 主管领导, (select listagg(b.姓名, ',') within group(order by bid) from b where instr(',' || a.主管领导 || ',', ',' || b.bid || ',') > 0) 主管领导姓名 from a
合格的二楼
imcmuc 2018-01-09
  • 打赏
  • 举报
回复
引用 14 楼 freedom97 的回复:
研究了一下啊上午被后面的‘,’迷惑了 写成这样是不是清晰了很多? select aid, 主管领导, (select listagg(b.姓名, ',') within group(order by bid) from b where instr( a.主管领导, b.bid ) > 0) 主管领导姓名 from a select aid, 主管领导, (select listagg(b.姓名, ',') within group(order by bid) from b where a.主管领导 like ‘%’||b.bid||'%' > 0) 主管领导姓名 from a
如此的话,bid超过两位数和一位数的混合就会有问题
freedom97 2017-10-23
  • 打赏
  • 举报
回复
研究了一下啊上午被后面的‘,’迷惑了 写成这样是不是清晰了很多? select aid, 主管领导, (select listagg(b.姓名, ',') within group(order by bid) from b where instr( a.主管领导, b.bid ) > 0) 主管领导姓名 from a select aid, 主管领导, (select listagg(b.姓名, ',') within group(order by bid) from b where a.主管领导 like ‘%’||b.bid||'%' > 0) 主管领导姓名 from a
wmx8518 2017-08-10
  • 打赏
  • 举报
回复
2L的就可用,亲测有效
qq_33066405 2015-12-08
  • 打赏
  • 举报
回复
用函数该怎么写啊?我似乎也碰到了类似的问题。
半颗心丶 2015-12-08
  • 打赏
  • 举报
回复
太给力
Northgale 2015-11-22
  • 打赏
  • 举报
回复
这种范式设计的方法就是狗屎,用逗号分割,太挫了,最起码的一范式都不是,小数据量的这么做无视,大数据量的用函数,每条记录都要这么处理,上千万条的记录死定了
小灰狼W 2015-11-06
  • 打赏
  • 举报
回复
上下文切换成本相对于较大的表(千条以上)的全表扫描来说,可以忽略不计了 可以用一定数据量测试一下
jdsnhan 2015-11-06
  • 打赏
  • 举报
回复
看你数据的版本。 11.2以后的版本用2楼的方法最好了
美到心痛 2015-11-06
  • 打赏
  • 举报
回复
少个11g以前的: with a(aid,aa) as ( select 1,'1,2,3' from dual union all select 2,'2,4' from dual ), b(bid,bb) as ( select 1,'lee' from dual union all select 2,'liu' from dual union all select 3,'zhang' from dual union all select 4,'si' from dual ) select aid,aa,to_char(substr(WMSYS.WM_CONCAT(bb),1,1000)) aa_name from a,b where instr(','||a.aa||',',','||b.bid||',')>0 group by aid,aa
beyon2008 2015-11-06
  • 打赏
  • 举报
回复
listagg,二楼的办法
liuzhe_521 2015-11-05
  • 打赏
  • 举报
回复
引用 4 楼 wildwave 的回复:
性能最好的做法是写一个函数,根据逗号将id一个一个找出来转成名称再拼接返回 拼接顺序什么的也不会有问题
未必好,写成函数没有上下文切换成本吗?
小灰狼W 2015-11-05
  • 打赏
  • 举报
回复
性能最好的做法是写一个函数,根据逗号将id一个一个找出来转成名称再拼接返回 拼接顺序什么的也不会有问题
z123zjf 2015-11-05
  • 打赏
  • 举报
回复
学习了,还可以这么写
liuzhe_521 2015-11-05
  • 打赏
  • 举报
回复
select aid, 主管领导, (select listagg(b.姓名, ',') within group(order by bid) from b where instr(',' || a.主管领导 || ',', ',' || b.bid || ',') > 0) 主管领导姓名 from a
z123zjf 2015-11-05
  • 打赏
  • 举报
回复
with a as(select '1' aid,'1,2,3' 主管领导 from dual union all select '2','2,4' from dual), b as(select '1' bid,'李一' 姓名 from dual union all select '2','刘二' from dual union all select '3' ,'张三' from dual union all select '4','李四' from dual), aa as(select aid,regexp_substr(主管领导,'[^,]',1,level) 主管领导 from a connect by level<=regexp_count(主管领导,',')+1 and prior aid=aid and prior sys_guid() is not null), ab as(select aa.aid,aa.主管领导,b.姓名 from aa,b where aa.主管领导=b.bid) select aid,listagg(主管领导,',')within group(order by 主管领导) 主管领导, listagg(姓名,',')within group(order by 主管领导) 姓名 from ab group by aid

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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