一张表中某个字段保存多个外键值,逗号分隔,获取其对应的外键表数据

2020-03-11  本文已影响0人  代码届的泥石流sc

最近在项目中,遇到一个用户有多个角色的问题。数据库中保存的是角色编码是多个外键并用逗号分隔的值。需求需要查询出相应的中文值,并且合成一个字段。说明 若表字段有1,2,3 则需要根据1,2,3找出对应 的值a,b,c 组成一个字段。
下面开始实现记录:
1.创建学生表

--1.创建stu表
create table stu(
       sid varchar(100) primary key not null,
       sname varchar(100),
       bid varchar(100)
)

comment on column stu.sid is 'id值';
comment on column stu.sname is '名称';
comment on column stu.bid is '书籍,外键值';

--2.创建书籍表单
create table book(
       bid varchar(100) primary key not null,
       bname varchar(100),
       bprice varchar(100)
)

comment on column book.bid is 'id值';
comment on column book.bname is '书籍名称';
comment on column book.bprice is '书籍价格';
--插入数据
insert into stu values('1','小明','1,2');
insert into stu values('2','小红','1,3');
insert into stu values('3','小强','1,2,3,304');
insert into stu values('4','小威','2,3_4,3-3');
--插入数据,注意此处id 为304的数据
insert into book values('1','数学','12');
insert into book values('2','语文','16');
insert into book values('3','英文','13');
insert into book values('3_4','高中英语','10');
insert into book values('3-3','大学英语','20');
insert into book values('304','小学英语','25');

两边加逗号 ,防止 atesta  匹配 test
--         例:1.,a,b_c,d  匹配 %,b_c,%
--            2.,a,b,     匹配 %,a,%
--            3.,a-b,     匹配 %,a-b,%
1.首先我们写一条sql语句
select s.sid,s.sname,s.bid,
(select listagg(b.bname,',') within group(Order by b.bid) from book b where ',' || s.bid || ',' like '%,' || b.bid || ',%') as bname
from stu s

j1.png

结果如图:1-1
我们可以看看 3_4的模糊查找结果

select  * from book b where b.bid like '%3_4%';
j3.png

所以,我们应该避免此处有特殊字符的情况
2.用replace替换_,实现的sql语句

select s.sid,s.sname,s.bid,
(select listagg(b.bname,',') within group(Order by b.bid) from book b where ',' || replace(s.bid,'_','') || ',' like '%,' || replace(b.bid,'_','') || ',%') as bname
from stu s

结果如图:1-2

j2.png
总结:模糊查找代表一个字符了。3_4可以找到304 ,314、3_4。。。等记录 ,所以查找时首先把替换为'', 准确查找所有记录。
这就是一张表字段有多个外键值,查找的方法记录。
ly_dv 一个小菜鸟
上一篇 下一篇

猜你喜欢

热点阅读