過濾具有多通關係的 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中文網其他相關文章!