博客
关于我
oracle一张表的id关联另一张表中的字段
阅读量:502 次
发布时间:2019-03-07

本文共 1899 字,大约阅读时间需要 6 分钟。

假设现在有两个表

表一:

idnum sname score
140643851 小A 87
140643856 小B 88
140643931 小C 92
140643611 小D 77
140643427 小E 81
140643155 小F 95
140643815 小G 78
140643492 小H 90
140643653 小I 71

表二:

id oname event
1001 小a 小a在2017-10-19通知了学号为140643851,140643856的学生
1003 小b 小b在2017-10-03通知了学号为140643931的学生
1005 小c 小c在2017-10-08通知了学号为140643611,140643427,140643155的学生

表一的id是学号,表二的event中的数字就是学号,现在要查出这样的表

id oname idnum sname

那怎么做呢?

第一步,要把表二中的学号匹配出来吧?用正则表达式就好啦
‘[0-9]{9}(,[0-9]{9})*’
注意这里的数字是9位,后面可能有若干个逗号加数字,所以用括号括起来,用了‘*’
这个’*’就是零个或者多个的意思啦,{9}表示这样的数字有9位。有关正则可以看这一篇博客总结

然后用oracle里的正则函数

regexp_substr(t.event, ‘[0-9]{9}(,[0-9]{9})*’),这个就可以把数字取出来了。

第二步,第一步的做法拿到的是这样的数字,这个表是test_tb,一个辅助中间表

value
140643851,140643856
140643931
140643611,140643427,140643155

但是要跟表一关联的话,需要的是这样的数字

学号
140643851
140643856
140643931
140643611
140643427
140643155

这个要怎么做呢?用connect by.

SELECT distinct regexp_substr(t.value, '[^,]+',1,level)  FROM test_tb tCONNECT BY t.value = PRIOR t.value       AND LEVEL <= (length(t.value)-length(regexp_replace(t.value, ',', '')))+1       AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL

说明:

这里的level就是一个层级的概念,比如吧

学号
140643851,140643856
140643931
140643611,140643427,140643155

这个第三列,有三个数,就有三层,level就要小于3

所以就要先算出这列有几个数据,可以用下面这句sql试一下

select t.value, (length(t.value)-length(regexp_replace(t.value, ',', '')))+1 from test_tb t

其实就是算出逗号的个数再加一就是有几个数。

最后的sql就是这样啦

select op.id, op.oname, tu.idnum, tu.sname from(select distinct to_number(regexp_substr(tb.value, '[^,]+',1,level)) as tid, tb.oid as oid from(select regexp_substr(o.event, '[0-9]{9}(,[0-9]{9})*') as value, o.id as oid from test_oper owhere regexp_substr(o.event, '[0-9]{9}(,[0-9]{9})*') is not null) tbCONNECT BY TB.value = PRIOR TB.value       AND LEVEL <= (length(tb.value)-length(regexp_replace(tb.value, ',', '')))+1       AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL)mm, test_stu tu, test_oper opwhere mm.tid = tu.idnumand mm.oid = op.id

结果就是

这里写图片描述

这里临时自定义了几个表,为了对应关系

你可能感兴趣的文章
LiveGBS user/save 逻辑缺陷漏洞复现(CNVD-2023-72138)
查看>>
localhost:5000在MacOS V12(蒙特利)中不可用
查看>>
logstash mysql 准实时同步到 elasticsearch
查看>>
Luogu2973:[USACO10HOL]赶小猪
查看>>
mabatis 中出现&lt; 以及&gt; 代表什么意思?
查看>>
Mac book pro打开docker出现The data couldn’t be read because it is missing
查看>>
MAC M1大数据0-1成神篇-25 hadoop高可用搭建
查看>>
mac mysql 进程_Mac平台下启动MySQL到完全终止MySQL----终端八步走
查看>>
Mac OS 12.0.1 如何安装柯美287打印机驱动,刷卡打印
查看>>
MangoDB4.0版本的安装与配置
查看>>
Manjaro 24.1 “Xahea” 发布!具有 KDE Plasma 6.1.5、GNOME 46 和最新的内核增强功能
查看>>
mapping文件目录生成修改
查看>>
MapReduce程序依赖的jar包
查看>>
mariadb multi-source replication(mariadb多主复制)
查看>>
MariaDB的简单使用
查看>>
MaterialForm对tab页进行隐藏
查看>>
Member var and Static var.
查看>>
memcached高速缓存学习笔记001---memcached介绍和安装以及基本使用
查看>>
memcached高速缓存学习笔记003---利用JAVA程序操作memcached crud操作
查看>>
Memcached:Node.js 高性能缓存解决方案
查看>>