这个查询可以避免子查询吗?
Can sub-query be avoided in this query?
我的数据库中的三个 table 如下:
- 老师的table
teachers: teacher_id, teacher_name
- 学生table
students: student_id, student_name
- 教师与学生之间存在多对多关系,因此他们专门 table as per this answer:
students_volunteers: teacher_id (FK), student_id(FK)
现在假设一位老师不能参加 class,所以 he/she 发布了 substitute_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
或其他东西来提高性能......
你可以试试 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
我的数据库中的三个 table 如下:
- 老师的table
teachers: teacher_id, teacher_name
- 学生table
students: student_id, student_name
- 教师与学生之间存在多对多关系,因此他们专门 table as per this answer:
students_volunteers: teacher_id (FK), student_id(FK)
现在假设一位老师不能参加 class,所以 he/she 发布了 substitute_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
或其他东西来提高性能......
你可以试试 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