SQL Select Top with Left Join和Where子句

时间:2019-02-03 13:27:23

标签: sql sql-server join

我有两个数据库表:

城市,其中包含列:

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个字符,然后是'%'。

2 个答案:

答案 0 :(得分:0)

我建议先在Countries.Country_Code上添加聚集索引(如果还不是,请使其成为Countrys表的主键)。索引将对表进行排序,从而提高联接中的搜索速度。

答案 1 :(得分:0)

这似乎是您的查询:

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周围不需要报价。

我不了解LEFT JOIN。它表明有些城市没有有效的Country_Code,这似乎不太可能。

假设@CityName不是不是以通配符开头(如您的问题所建议),则可以利用索引。我建议以下索引:

  • cities(city_name, country_code)
  • countries(country_code, country_name)

如果country_code是主键,则不需要第二个。