Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MS Access 2010 SQL Top N查询(按组性能问题)_Sql_Performance_Ms Access 2010 - Fatal编程技术网

MS Access 2010 SQL Top N查询(按组性能问题)

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条记录运行它,查询将不再产生结果(没有错误消息,但超时

我有两个表,一个是项目度量表(MASE_表),另一个是项目属性表(SKU)。项目属性可以是Planner、ABCByPick、XYZ或其他属性

通过一个查询,我想通过属性ABCByPick获得该度量值(AvgOfScaledError)的前10项

我希望使查询尽可能通用,以便复制它并用属性规划器替换ABCByPick

我在这里找到了一些我尝试过的技巧。只要MASE_表中的记录数少于1000,我就可以执行查询。如果我想用MASE_表中的8000条记录运行它,查询将不再产生结果(没有错误消息,但超时)

以下是我对ABCByPick前10名的查询:

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和DmdUnit
SKU上的主键是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名创建一个临时表,然后直接加入主查询。除此之外,你是索尔。谢谢丹,请看下面我的答案。