MS Access 2010 SQL Top N查询(按组性能问题)
我有两个表,一个是项目度量表(MASE_表),另一个是项目属性表(SKU)。项目属性可以是Planner、ABCByPick、XYZ或其他属性 通过一个查询,我想通过属性ABCByPick获得该度量值(AvgOfScaledError)的前10项 我希望使查询尽可能通用,以便复制它并用属性规划器替换ABCByPick 我在这里找到了一些我尝试过的技巧。只要MASE_表中的记录数少于1000,我就可以执行查询。如果我想用MASE_表中的8000条记录运行它,查询将不再产生结果(没有错误消息,但超时) 以下是我对ABCByPick前10名的查询:MS Access 2010 SQL Top N查询(按组性能问题),sql,performance,ms-access-2010,Sql,Performance,Ms Access 2010,我有两个表,一个是项目度量表(MASE_表),另一个是项目属性表(SKU)。项目属性可以是Planner、ABCByPick、XYZ或其他属性 通过一个查询,我想通过属性ABCByPick获得该度量值(AvgOfScaledError)的前10项 我希望使查询尽可能通用,以便复制它并用属性规划器替换ABCByPick 我在这里找到了一些我尝试过的技巧。只要MASE_表中的记录数少于1000,我就可以执行查询。如果我想用MASE_表中的8000条记录运行它,查询将不再产生结果(没有错误消息,但超时
SELECT s2.ABCByPick
,m2.DmdUnit
,ROUND(m2.AvgOfScaledError, 2) AS MASE
FROM MASE_Table AS m2
INNER JOIN SKU AS s2
ON ( m2.Loc = s2.Loc )
AND ( m2.DmdUnit = s2.Item )
WHERE m2.AvgOfScaledError IN ( SELECT TOP 10 m1.AvgOfScaledError
FROM (
SELECT m1.Loc
,m1.DmdUnit
,s1.ABCByPick
,m1.AvgOfScaledError
FROM MASE_Table AS m1
INNER JOIN SKU AS s1
ON m1.Loc = s1.Loc
AND m1.DmdUnit = s1.Item
)
WHERE s1.ABCByPick = s2.ABCByPick
ORDER BY m1.AvgOfScaledError DESC )
ORDER BY s2.ABCByPick
,m2.AvgOfScaledError DESC;
MASE_表上的主键是Loc和DmdUnitSKU上的主键是Loc和Item这应该对某些人有所帮助:
SELECT s2.ABCByPick,
m2.DmdUnit,
ROUND(m2.AvgOfScaledError, 2) AS MASE
FROM MASE_Table AS m2
INNER JOIN SKU AS s2 ON m2.Loc = s2.Loc
AND m2.DmdUnit = s2.Item
WHERE m2.AvgOfScaledError IN (
SELECT TOP 10 m1.AvgOfScaledError
FROM MASE_Table AS m1
INNER JOIN SKU AS s1 ON m1.Loc = s1.Loc
AND m1.DmdUnit = s1.Item
WHERE s1.ABCByPick = s2.ABCByPick
ORDER BY m1.AvgOfScaledError DESC
)
ORDER BY s2.ABCByPick,
m2.AvgOfScaledError DESC;
谢谢你的回复。不幸的是,删除子查询并不能提高性能(10分钟后,MASE_表中有8000条记录,仍然没有响应)。从概念上讲,有没有其他方法可以实现这一点?您可以为前10名创建一个临时表,然后直接加入主查询。除此之外,你是索尔。谢谢丹,请看下面我的答案。