消息关闭
    暂无新消息!


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

现在有两个表,表a中

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

表b中

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

求救!!!!

12个回答

︿ 3
上下文切换成本相对于较大的表(千条以上)的全表扫描来说,可以忽略不计了
可以用一定数据量测试一下
︿ 0
少个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
︿ 0
性能最好的做法是写一个函数,根据逗号将id一个一个找出来转成名称再拼接返回
拼接顺序什么的也不会有问题
︿ 0
select aid, 主管领导,
       (select listagg(b.姓名, ',') within group(order by bid)
           from b
          where instr(',' || a.主管领导 || ',', ',' || b.bid || ',') > 0) 主管领导姓名
  from a
︿ 0
这种范式设计的方法就是狗屎,用逗号分割,太挫了,最起码的一范式都不是,小数据量的这么做无视,大数据量的用函数,每条记录都要这么处理,上千万条的记录死定了
︿ 0
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