oracle 一个字段存多个ID(以逗号","分割),并用该字段与其他表的ID关联

核心

对两张表的关联字段左右两边同时加上分隔符,然后使用instr()函数判断是否存在

instr(','||class_student.student_id||',' , ','||student.student_id||',') > 0

数据

student(学生表)

学生编号学生姓名
1张三
2李四
3王五

class_student(班级学生关系表)

班级编号学生编号
11,2
23
34

应用

1. 标题查询学生所在班级(一个字段存多个ID(以逗号","分割),并用该字段与其他表的ID关联)
with student as(--学生表
 select '1' student_id,'张三' student_name from dual union
 select '2' student_id,'李四' student_name from dual union
 select '3' student_id,'王五' student_name from dual
),class_student as(--班级学生关系表
 select '1' as class_id,'1,2' student_id from dual union
 select '2' as class_id,'3' student_id from dual union
 select '3' as class_id,'4' student_id from dual 
)select 
   student.student_id,
   class_student.class_id
from student 
 join class_student on instr(','||class_student.student_id||',' , ','||student.student_id||',') > 0

结果展示

学生编号班级编号
11
21
32
2. 获取每个班级学生对应姓名(将存多个ID(以逗号","分割)的字段转化成对应中文含义)
with student as(--学生表
select '1' student_id,'张三' student_name from dual union
select '2' student_id,'李四' student_name from dual union
select '3' student_id,'王五' student_name from dual
),class_student as(--班级学生关系表
select '1' as class_id,'1,2' student_id from dual union
select '2' as class_id,'3' student_id from dual union
select '3' as class_id,'4' student_id from dual 
)select 
class_student.class_id,
(select listagg(student.student_name, ',') within group(order by student.student_id) from student where instr(','||class_student.student_id||',' , ','||student.student_id||',') > 0) student_name
from class_student 

结果展示

班级编号学生姓名
1张三,李四
2王五
3
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值