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