解决方案 »
- oracle 数据库导入数据的问题
- 各位侠客,我请问个问题,刚oracle9i里我建错了一些表和试图,索引什么的
- 高难度问题,向各位专家求助!
- REPLACE PACKAGE 这样的命令oracle是否会自动编译 ?
- 刚用oralce问个初级问题,关于新建用户授权。
- 我正在学Orcale 各位有没有什么经典的书籍推荐一下.
- 请问sys的密码是在pwdsid.ora验证呢,还是在dba_users验证??
- 漢字的排序是按那种規律??
- 安装了ORACLE8.0.5的WIN2K机器在将机器名更改之后,监听服务起不来,请问怎样解决,谢谢
- ??用exp导出表时,出现如下问题(用sqlplus也是),tns可以正常启动。请帮助!
- 求各位大神帮我看下这条SQL?
- 如何删除刚刚插入表的那几行数据
from t_course a,t_teacher b,t_ttc c,t_class d
where a.course_id = c.course_id and b.teacher_id = c.teacher_id and d.class_id = c,class_id
and d.class_id='001'
group by a.course_name,a.course_id,b.teacher_name,b.teacher_id这样得到一个List<Map<String,Object>>类型的结果集,然后再对这个结果集遍历,筛选出course信息一样的,作为key,然后每一个key 再遍历得到List<Teacher>,最后拼成List<Map<Course,List<Teacher>>。不过,这样感觉sql写得效率会很低,希望有高人指点,非常感谢!!!
select a.course_name,a.course_id,b.teacher_name,b.teacher_id
from t_course a,t_teacher b,t_ttc c,t_class d
where a.course_id = c.course_id and b.teacher_id = c.teacher_id and d.class_id = c,class_id
c.course_id in(
select course_id from t_ttc where class_id = '001' group by course_id)
and d.class_id = '001'他给出的理由是这样分组比较简单,效率会提高
但是最后还是要去Java代码中循环结果集,分别筛选处理,跟上面的基本没啥区别,请教有没有高手可以给出更合理的解决方案
上面两条语句的逻辑不一样,第一条是找出001班级的所有课程,及该课程的任课老师;第二条,是找出001班级的所有课程,以及这些课程在所有班级里的任课老师
正常来说,一个班级里的所有课程,对应的老师只有一个。即使有多个,照你的语句来看,只要不出现重复的,比如id为001的班级的 物理课 ,任课老师为 Teacher1的出现了两条,即可上面的第一条语句可以去掉group by第二条,如果考虑分组的效率,是因为t_ttc表较大。可以将c.course in ()改为
exists(select 1 from t_ttc cx where cx.class_id='001' and cx.course_id=c.course_id)
把同一条记录中候选老师的名字用wmsys.wm_concat连接起来就行了
select a.course_name,a.course_id,
to_char(wmsys.wm_concat(b.teacher_name)) teacher_name,
to_char(wmsys.wm_concat(b.teacher_id)) teacher_id
from t_course a,t_teacher b,t_ttc c,t_class d
where a.course_id = c.course_id and b.teacher_id = c.teacher_id and d.class_id = c,class_id
and d.class_id='001'
group by a.course_name,a.course_id
数据库版本如果是11g的话可以考虑listagg的写法,可以控制拼接时候的排序及拼接符,效果更好一些
读取到程序中直接利用函数对字符串进行拆分就行了
例如.net中就可以直接使用 字符串.split(",") 得到一个数组