[英]SQL Select Top with Left Join and Where clause
我有兩個數據庫表:
有專欄的城市 :
Country_Code | City_Code | City_Name
有專欄的國家
Country_Code | Country_Name
根據用戶輸入的幾個字符,它檢查City_Name
列以返回結果以填充City
自動完成框。 結果需要具有城市代碼,城市名稱,國家/地區代碼和國家/地區名稱,因此需要加入。
我正在使用的查詢是
SELECT TOP 10
ci.Country_Code, ci.City_Code, ci.City_Name, co.Country_Name
FROM
Cities ci
LEFT OUTER JOIN
Countries co ON ci.Country_Code = co.Country_Code
WHERE
ci.City_Name LIKE '@CityName'
ORDER BY
ci.City_Name
我得到的結果是正確的,但是查詢需要很長時間才能完成。 據我了解,首先,結果包含兩個表的聯接,然后使用where子句以僅獲取特定行,這些行按城市名稱排序,並返回前10個結果。
我的問題是,有沒有一種方法可以加快查詢速度。 是否檢查過where子句,然后僅執行聯接,最好還是僅對前10個結果進行聯接? 我嘗試將WHERE
子句放在ON
子句中,但是結果不正確。
編輯:@CityName包含用戶輸入的2-3個字符,然后是'%'。
我建議開始與添加聚簇索引 Countries.Country_Code
(也使其成為國家表的主鍵,如果它是不是已經如此)。 索引將對表進行排序,從而提高聯接中的搜索速度。
這似乎是您的查詢:
SELECT TOP 10 ci.Country_Code, ci.City_Code, ci.City_Name, co.Country_Name
FROM Cities ci LEFT OUTER JOIN
Countries co
ON ci.Country_Code = co.Country_Code
WHERE ci.City_Name LIKE @CityName
ORDER BY ci.City_Name ;
@CityName
周圍@CityName
。
我不了解LEFT JOIN
。 這表明有些城市沒有有效的Country_Code
這似乎不太可能。
假設@CityName
並非以通配符開頭(如您的問題所建議),則可以利用索引。 我建議以下索引:
cities(city_name, country_code)
countries(country_code, country_name)
如果country_code
是主鍵,則不需要第二個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.