过滤具有多通关系的 SQL 结果:实用指南
跨表高效查询具有多通关系的数据对于数据库性能至关重要。 让我们用一个涉及三个表的常见场景来说明:
student
(ID、姓名)club
(ID、姓名)student_club
(学生 ID,俱乐部 ID)挑战:识别足球(club_id 30)和棒球(club_id 50)俱乐部成员的学生。
为什么简单的 JOIN 失败:
使用连接的简单方法是无效的:
<code class="language-sql">SELECT student.* FROM student INNER JOIN student_club sc ON student.id = sc.student_id LEFT JOIN club c ON c.id = sc.club_id WHERE c.id = 30 AND c.id = 50;</code>
此操作失败,因为单个 club
记录不能同时具有 id = 30
和 id = 50
。
有效的解决方案:
1。 嵌套 IN
查询:
此方法使用两个子查询来查找每个俱乐部的学生,然后对结果进行相交:
<code class="language-sql">SELECT student.* FROM student WHERE student.id IN ( SELECT student_id FROM student_club WHERE club_id = 30 ) AND student.id IN ( SELECT student_id FROM student_club WHERE club_id = 50 );</code>
即使对于大型数据集,此方法通常也很有效。
2。使用INTERSECT
:
INTERSECT
运算符提供了更简洁的解决方案:
<code class="language-sql">SELECT student.* FROM student WHERE student.id IN ( SELECT student_id FROM student_club WHERE club_id = 30 ) INTERSECT SELECT student.id FROM student WHERE student.id IN ( SELECT student_id FROM student_club WHERE club_id = 50 );</code>
INTERSECT
仅返回两个子查询中的通用学生 ID,从而有效地识别两个俱乐部的学生。 此方法与嵌套 IN
方法之间的选择通常取决于数据库系统首选项和查询优化器行为。 两者对于这项任务通常都很有效。
以上是如何高效过滤属于多俱乐部的多俱乐部学生?的详细内容。更多信息请关注PHP中文网其他相关文章!