访问SQL查询优化,添加GROUP BY时缓慢

时间:2012-08-03 20:46:33

标签: sql ms-access group-by query-optimization

所以,我有两个问题。一个是,我是否真的采取了正确的效率方法?我正在尝试创建一个名为Type的新列,根据两个表的字段是否匹配来吐出不同的名称。这是一个嵌套的IF语句。查询很容易在2-3秒内完成,但我希望GROUP BY为ItemName,然后是Type,因为有很多重复项。在这样做之后,查询没有完成,超时,并且声称在尝试10分钟后过于复杂。我也尝试过使用DISTINCT和FIRST而没有太多运气。在宏观方案中,我希望将此查询与其他查询相结合,并创建按类型分组的运行总和。因此,重要的是我可以在此查询中执行GROUP BY以使我的最终查询起作用。以下是查询:

SELECT Inventory_All.ItemName, 

IIF(Inventory_All.[ItemName]=Products.[QB Assembly Name], "Assembly Part",
IIF(Inventory_All.[ItemName]=Products.[QB Service Part Name],"Service Part",
IIF(Inventory_All.[ItemName]=Components.[QB Component Name],Components.Type,"Other") )) AS Type

FROM 
(Inventory_All LEFT JOIN Products ON Inventory_All.ItemName=Products.[QB Assembly Name] OR Inventory_All.ItemName=Products.[QB Service Part Name]) LEFT JOIN Components ON Inventory_All.ItemName=Components.[QB Component Name];

我读了其他有类似问题的人,我试过索引,但似乎没有帮助。似乎我需要重新创建这个查询,其中GROUP BY函数不必处理几乎同样多的事情。我不确定这种形式的SQL和GROUP BY是如何表现的。有关简化查询以让GROUP BY(或类似函数)工作的任何提示吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

也许就是这些问题:

SELECT Inventory_All.ItemName, Type
FROM (
   SELECT "Assembly Part" As TYPE 
   FROM Inventory_All 
   LEFT JOIN Products ON Inventory_All.ItemName=Products.[QB Assembly Name]
   UNION
   SELECT "Service Part" As TYPE 
   FROM Inventory_All 
   LEFT JOIN Products ON Inventory_All.ItemName=Products.[QB Service Part Name]
   UNION
   SELECT "Other" As TYPE 
   FROM Inventory_All.ItemName=Components.[QB Component Name]) As x

答案 1 :(得分:0)

我认为你想重组你的查询。做三个单独的连接,每个连接一个。然后,保持每个零件类型的项目计数 - 一个用于装配,一个用于服务,一个用于组件。

您将获得一个结果集,其中包含每种类型的名称和出现次数。然后用你做你想做的事。

我在移动设备上,因此无法输入SQL。