我會重新組織查詢,以避免跨產品使用,
表示法。
此外,您實際上只使用sector
和type
表作爲過濾器。所以先把activity
表,然後加入你的其他表。
有人可能會建議;理想情況下,第一次加入應該是最有可能限制您的結果的加入,而在第二次加入時將剩下最少的工作量。實際上,在生成計劃時,sql引擎實際上可以重新安排您的查詢,但它確實有助於以這種方式來幫助您考慮sql引擎所要做的工作。
最後,每個表上都有索引。我真的建議倒車指數...
- ActivitySector THEN ActivityId
- ActivityType THEN ActivityId
這是專門因爲SQL引擎操作查詢。它可以採用WHERE子句並說「只包含來自扇區表的記錄,其中ActivitySector = 5」,對於類型表類似。通過讓Sector和Type在索引中標識FIRST,表格的這種過濾可以更快地完成,然後這些聯接的工作就會少得多。
SELECT
[activity].id
FROM
jdc_organizations_activities AS [activity]
INNER JOIN
jdc_activity_sector AS [sector]
ON [activity].id = [sector].activityId
INNER JOIN
jdc_activity_type AS [type]
ON [activity].id = [type].activityId
WHERE
[sector].activitySector = 5
AND [type].activityType = 3
或者,因爲你沒有實際使用的活動表的內容...
SELECT
[sector].activityId
FROM
jdc_activity_sector AS [sector]
INNER JOIN
jdc_activity_type AS [type]
ON [sector].activityId = [type].activityId
WHERE
[sector].activitySector = 5
AND [type].activityType = 3
或...
SELECT
[activity].id
FROM
jdc_organizations_activities AS [activity]
WHERE
EXISTS (SELECT * FROM jdc_activity_sector WHERE activityId = [activity].id AND activitySector = 5)
AND EXISTS (SELECT * FROM jdc_activity_type WHERE activityId = [activity].id AND activityType = 3)
偏離主題,但我建議您堅持使用'JOIN'語法,而不是混入舊的'''連接語法。 – MatBailie