SQL选择顶配左连接和Where子句

问题描述 投票:1回答:2

我有两个数据库表:

城市列:

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个字符。

sql sql-server join
2个回答
0
投票

我建议开始与添加上Countries.Country_Code聚集索引(也使其成为国家表的主键,如果它是不是已经如此)。索引排序会使得加入搜索速度提高了表。


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是主键。

© www.soinside.com 2019 - 2024. All rights reserved.