可以在此查询中避免子查询吗?

时间:2020-08-30 11:34:57

标签: mysql sql subquery query-optimization where-clause

数据库中的三个表如下:

  • 教师桌
    teachers: teacher_id, teacher_name
  • 学生桌
    students: student_id, student_name
  • 师生之间存在多对多关系,因此他们有专用的表as per this answer
    students_volunteers: teacher_id (FK), student_id(FK)

现在,假设一位老师不能上课,所以他/她发布了一个replace_request,因此我们只想向那些共同拥有相同学生的老师发送通知。因此,我编写了相同的SQL查询:

SELECT DISTINCT students_volunteers.v_id_sv 
FROM   students_volunteers 
WHERE  students_volunteers.s_id_sv IN (SELECT students_volunteers.s_id_sv 
                                       FROM   students_volunteers 
                                       WHERE  v_id_sv = 3) 
       AND students_volunteers.v_id_sv <> 3 

它工作正常,除了它有一个子查询,由于性能问题,它不理想。
所以我想知道我们是否可以使用一些JOIN或其他东西来提高性能.....

1 个答案:

答案 0 :(得分:1)

您可以尝试使用not exists

SELECT DISTINCT teacher_id
FROM students_volunteers sv
WHERE 
    teacher_id <> 3
    AND EXISTS (
        SELECT 1
        FROM students_volunteers sv1
        WHERE sv1.teacher_id = 3 AND sv1.student_id = sv.student_id
    )

或者,这是一种使用自我join的方法:

SELECT DISTINCT sv.teacher_id
FROM students_volunteers sv
INNER JOIN students_volunteers sv1
    ON sv1.teacher_id <> sv.teacher_id
    AND sv1.student_id = sv.student_id
WHERE sv1.teacher_id = 3
相关问题