解决方案 »

  1.   

    最初我的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
    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写得效率会很低,希望有高人指点,非常感谢!!!
      

  2.   

    后来同事说可以这样写:
    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代码中循环结果集,分别筛选处理,跟上面的基本没啥区别,请教有没有高手可以给出更合理的解决方案
      

  3.   

    没明白...
    上面两条语句的逻辑不一样,第一条是找出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)
      

  4.   

    看起来像是个表中表的需求
    把同一条记录中候选老师的名字用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(",") 得到一个数组
      

  5.   

    的确是表中表的结构,不知道这样可不可行啊,还有就是我用的是mysql数据库,没有这个函数啊?
      

  6.   

    mysql的问题建议到mysql的板块去问,这边oracle区,懂mysql的不多,就算懂的也只是一知半解