嵌套查询:最佳实践

时间:2013-09-26 12:03:09

标签: sql ms-access join ms-access-2010

我正在尝试加快查询速度。其中很多都很复杂,目前我通过创建多个查询并通过连接链接它们来实现这一目标。

这是最佳做法,还是应该在SELECT内使用SELECT并尝试在一个查询中实现相同的功能?

任何一个选项都会对速度产生影响,还是复杂只是复杂的?

编辑:以下示例查询

SELECT HoldingCoNos.ID
FROM (
  SELECT [SearchByName - No Filter].ID
  FROM [SearchByName - No Filter]
  INNER JOIN [SearchByName - Level 1 Subsidiaries]
  ON [SearchByName - No Filter].ID = [SearchByName - Level 1 Subsidiaries].[Holding Company]
) AS HoldingCoNos
GROUP BY HoldingCoNos.ID;

这是在一个查询中使用它 - 另一个选项是将查询的FROM部分的内容创建为两个单独的查询,保存它们并使用内部联接。

2 个答案:

答案 0 :(得分:3)

一般来说: 对父查询中的每一行执行子查询,例如

从姓名为IN的员工中选择*(从Team_project中选择Manager_name,其中project_id = 1)

它将为employees表中的每一行执行select manager_name,以比较授予查询缓存的名称,这会使其更快,但它仍然更有效。

然而,这一切都取决于更多细节,请看这个讨论: Subquery v/s inner join in sql server

答案 1 :(得分:2)

查看您的示例查询,我可以指出以下几点:

  • 这里你真的不需要子查询。您正在从子查询中选择单个字段并按该字段进行分组。相反,你可以摆脱外部查询而只是select distinct [SearchByName - No Filter].ID
  • 感知是现实的十分之九。您的查询看起来很复杂,部分原因是您在所有地方使用完整的表名而不是短表别名。注意与别名的区别(以及一些小心的格式化)。当您的查询变大时,这将被放大几倍:

SQL:

select distinct sbnnf.ID as HoldingCoID
from [SearchByName - No Filter] as sbnnf
inner join [SearchByName - Level 1 Subsidiaries] as sbnl1s
on sbnnf.ID = sbnl1s.[Holding Company];