现在有三张表
1.教师表(teacher)
结构为teacher_id,teacher_name
2.学生表(student)
结构为student_id,student_name
3.教师学生关联表(teacher_students)
结构为teacher_id,students
前两张就不用说了,第三张的students数据结构如下
student_id:is_later;student_id:is_later的结构
student_id表示的是学生id,is_later表示是否迟到,现在考虑要展示如下的情况:
teacher_id,teacher_name,student_name:is_later;student_name:is_later
你可以问设计人员,设计表的时候有没有考虑怎么取数据的,怎么关联的?
还有你说的放在内存中,是说把10000*10000条数据放内存中吗?
这样内存能不能负荷可能是个问题,估算了下大概是要1G的内存,
如果几个人同时调用那难了
其实还有个办法,你可以只关联教师表和学生表,在需要用到islater的时候,然后再传入teacher_id重新查一次,也就是说放在程序里面处理。
如果是显示列表的形式就不好办了,
要查询的次数就多了
select t.teacher_id,t.teacher_name,
s.student_id||':'||ts.is_later,
s.student_name||':'||ts.islater
from teacher t,student s,teacher_students ts
where t.teacher_id = ts.teacher_id
and s.student_id = substr(ts.students,0,ts.students.indexOf(':'));
获取字符':'的oracle函数忘了,应该不是indexOf(),应该是有这个函数的
是写错了,我知道islater不是ts的列,
改了下,试试看
select t.teacher_id,t.teacher_name,
s.student_id||':'||substr(ts.students,instr(ts.students,':')+1,length(ts.students)-1),
s.student_name||':'||substr(ts.students,instr(ts.students,':')+1,length(ts.students)-1)
from teacher t,student s,teacher_students ts
where t.teacher_id = ts.teacher_id
and s.student_id = substr(ts.students,0,instr(ts.students,':')-1)
别名你自己改下~
你可以试试吗?
我认为不可能会出现你说的那个结果~~~
哦~ 看了下你的数据,我的SQL是不对
我认为要用一个SQL写,够呛,应该不能完成要求把,
为什么那张关系表不这样设计呢?
teacher_id,student_id,islater
一目了然,很变态的表结构~~~
想了想思路,你看这样行的通么,
用函数或者过程把,应该是返回游标类型
步骤:
新建临时表,结构:teacher_id,student_id,islater
首先查询关系表teacher_students,
循环遍历查询结果,取的student列,
用类似split的函数按‘:’将该列转成数组(不太清楚oracle是否有这个函数),在遍历数组,循环中,将teacher_id,student_id,islater插入到临时表中去,
然后关联teacher,student,临时表,
删除临时表(不知道删除以后,通过游标获取数据是否会有问题)
返回游标。
查过了,oracle没有将字符串转成数组的函数,
需要将 转成数组和遍历数组的步骤
换成
(var_tmp是student列,值如“1:0,2:1,3:0”)
一段一段的截取,先截取1:0,然后将剩下的部分赋值var_tmp(去掉一个','),
再从'1:0'中提取student_id和islater
如下SQL:
[code="SQL"]
while instr(var_tmp,',')>0 loop
var_element := substr(var_tmp,1,instr(var_str,',')-1);
var_tmp := substr(var_tmp,instr(var_str,',')+1,length(var_tmp));
...
(提取student_id和islater并插入到临时表)
end loop;
[/code]
这样的交流是有利于提升的~ 也学到不少东西,所以不要客气~ :D