Tres de las tablas en mi base de datos son las siguientes:

  • Mesa del maestro
    teachers: teacher_id, teacher_name
  • Mesa del estudiante
    students: student_id, student_name
  • Los profesores y los estudiantes tienen una relación de muchos a muchos y, por lo tanto, tienen una tabla dedicada según esta respuesta:
    students_volunteers: teacher_id (FK), student_id(FK)

Ahora digamos que un maestro no puede tomar una clase, por lo que publica un sustituto_request, por lo que queremos enviar una notificación solo a aquellos maestros que tienen los mismos estudiantes en común. Entonces escribí la consulta SQL para lo mismo:

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 

Y funciona bien, excepto que tiene una subconsulta, que debido a problemas de rendimiento no es ideal.
Así que quiero saber si podemos usar algo de JOIN o algo más para mejorar el rendimiento .....

0
asdfasdfasdf 30 ago. 2020 a las 14:34

1 respuesta

La mejor respuesta

Puedes probar con 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
    )

Alternativamente, aquí hay un enfoque con un yo: 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
1
asdfasdfasdf 30 ago. 2020 a las 12:14