我有两个SQL表,“国家”和“国家/地区” I18N:
Countries > Code
CountriesI18N > CountryCode, LanguageCode, Name
我正在获取选择以下内容的国家/地区列表:
第一个T-SQL选项如下:
SELECT [x].[Code], (
SELECT TOP(1) [z].[Name]
FROM [CountriesI18N] AS [z]
WHERE ([z].[LanguageCode] = 'en' AND ([x].[Code] = [z].[CountryCode])
) AS [Name]
FROM [Countries] AS [x]
以及使用内部联接的替代方法:
SELECT [x].[Code], [x.CountriesI18N].[Name]
FROM [Countries] AS [x]
INNER JOIN [CountriesI18N] ON [x].[Code] = [x.CountriesI18N].[CountryCode]
WHERE [x.CountriesI18N].[LanguageCode] = 'en'
它们在速度和效率上是否相等?
如果我有很多使用许多InnerJoins或Subqueries的相关表是否等效?
答案 0 :(得分:0)
首先,它们不是等效查询。对于您的特定数据,它们可能外观等效,但事实并非如此。子查询返回最多一个匹配项。 inner join
过滤掉不匹配项,并可以返回重复项。
所以,您正在比较苹果和橙子。
无论哪种情况,您都希望在
CountriesI18N(CountryCode, LanguageCode)
。这恰好是这两个查询版本的最佳索引。