Sql 如何在同一行上建立联接和自联接

Sql 如何在同一行上建立联接和自联接,sql,oracle,join,Sql,Oracle,Join,情况是这样的: 有教师绩效和学生绩效实体,因此教师和学生可以参加相同的课程,并有他们的分数 老师可以教学生和老师 有一个教学关系表,是的,教师和学生都可以出现在考勤栏中,但只有教师可以出现在教师栏中 所需的报告表列出了所有教师的表现,加上由教师授课的学生和教师的平均表现 在我们的系统中,id是数字的,我把它命名为名字只是为了演示 教师表现(tb_tp) 学生表现(tb_sp) 教学关系(tb_tr) 所需报告: t_id | Score| avg_t AVG score from

情况是这样的:

  • 教师绩效
    学生绩效
    实体,因此教师和学生可以参加相同的课程,并有他们的分数
  • 老师可以教学生和老师
  • 有一个
    教学关系
    表,是的,教师和学生都可以出现在考勤栏中,但只有教师可以出现在教师栏中
  • 所需的报告表列出了所有教师的表现,加上由教师授课的学生和教师的平均表现
  • 在我们的系统中,id是数字的,我把它命名为名字只是为了演示

    教师表现(tb_tp)

    学生表现(tb_sp)

    教学关系(tb_tr)

    所需报告:

       t_id     | Score| avg_t  AVG score from Teacher | avg_s AVG score from Student
    --------------------------------------------------------------------------
       ASHLEY   |   6  |     (5 from John) /1          | (8 from Frank + 7 from Tim)/2
    --------------------------------------------------------------------------
       JOHN     |   5  |   (6 from ASHLEY) /1          | (8 from Frank) / 1
    

    我们怎样才能做到这一点?我想将两个连接在一起或合并两个查询,但任何一种方法都不能将结果保持在同一行上并且准确

    我认为您需要的技术是使用聚合进行两个外部连接。这是我未经测试的通行证:

    SELECT p.t_id, p.score, scores.avg_teacher_score, scores.avg_student_score
    FROM teacher_performance p
    JOIN (
      SELECT t_id, AVG( t.score) AS avg_teacher_score, AVG( s.score ) AS avg_student_score
      FROM teaching_relation tr
      LEFT JOIN teacher_performance t ON t.t_id = tr.a_id AND tr.a_type='teacher'
      LEFT JOIN student_performance s ON s.s_id = tr.a_id AND tr.a_type='student'
      ) scores
      ON scores.t_id = p.t_id
    

    我认为你需要的技术是两个外部连接和一个聚合。这是我未经测试的通行证:

    SELECT p.t_id, p.score, scores.avg_teacher_score, scores.avg_student_score
    FROM teacher_performance p
    JOIN (
      SELECT t_id, AVG( t.score) AS avg_teacher_score, AVG( s.score ) AS avg_student_score
      FROM teaching_relation tr
      LEFT JOIN teacher_performance t ON t.t_id = tr.a_id AND tr.a_type='teacher'
      LEFT JOIN student_performance s ON s.s_id = tr.a_id AND tr.a_type='student'
      ) scores
      ON scores.t_id = p.t_id
    

    你为什么用他们的名字作为标识符。。。?这似乎是一个非常糟糕的数据库设计-如果你有两个名为Scott的老师,或者一个名为John的老师和一个名为John的学生怎么办?@Siyual我们确实使用id,但出于演示目的,我将其命名为第一个名称…请在问题中使用您的实际结构。。。让它成为第一个名字而不是一个ID只是让人困惑。你如何在教学关系表中区分教师和学生?我们怎么知道ID是给学生的,而不是给老师的?@Siyual刚刚更新,实际世界由于ID格式不同,学生ID和老师ID永远不会相同,但我添加了考勤类型列来区分,还添加了表格标题。你为什么用他们的名字作为标识符。。。?这似乎是一个非常糟糕的数据库设计-如果你有两个名为Scott的老师,或者一个名为John的老师和一个名为John的学生怎么办?@Siyual我们确实使用id,但出于演示目的,我将其命名为第一个名称…请在问题中使用您的实际结构。。。让它成为第一个名字而不是一个ID只是让人困惑。你如何在教学关系表中区分教师和学生?我们怎么知道ID是给学生的而不是给老师的?@Siyual刚刚更新,实际世界中学生ID和老师ID永远不会相同,因为ID格式不同,但我添加了考勤类型列来区分,还添加了表头。
       t_id     | Score| avg_t  AVG score from Teacher | avg_s AVG score from Student
    --------------------------------------------------------------------------
       ASHLEY   |   6  |     (5 from John) /1          | (8 from Frank + 7 from Tim)/2
    --------------------------------------------------------------------------
       JOHN     |   5  |   (6 from ASHLEY) /1          | (8 from Frank) / 1
    
    SELECT p.t_id, p.score, scores.avg_teacher_score, scores.avg_student_score
    FROM teacher_performance p
    JOIN (
      SELECT t_id, AVG( t.score) AS avg_teacher_score, AVG( s.score ) AS avg_student_score
      FROM teaching_relation tr
      LEFT JOIN teacher_performance t ON t.t_id = tr.a_id AND tr.a_type='teacher'
      LEFT JOIN student_performance s ON s.s_id = tr.a_id AND tr.a_type='student'
      ) scores
      ON scores.t_id = p.t_id