簡體   English   中英

SQL Select Top with Left Join和Where子句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM