Microsoft Access - подзапрос работает очень медленно - PullRequest
0 голосов
/ 11 ноября 2018

Я пытаюсь собрать итоговую 12-месячную сумму для каждого клиента в конце каждого периода. Таблица «Периоды» содержит строку для каждого клиента для каждого требуемого периода.

Запрос выглядит следующим образом - работает, но работает очень медленно.

SELECT Periods.LTM_Start, Periods.Period_End, Periods.sa_account,
 (SELECT Sum(sa_trvalue) FROM [Sales Transactions]
    WHERE ((sa_trdate<= Periods.[Period_End])
    AND (sa_trdate>= Periods.[LTM_Start]) )
    AND 
    [Sales Transactions].sa_account = Periods.[sa_account]
    AS Total

FROM Periods
GROUP BY Periods.LTM_Start, Periods.Period_End, Periods.sa_account;

1 Ответ

0 голосов
/ 12 ноября 2018

Ваш запрос будет оцениваться медленно из-за использования вами коррелированного подзапроса, в результате чего запрос, ссылающийся на таблицу Sales Transactions, будет оцениваться для каждой записи таблицы Periods.

Вы должны быть в состоянии улучшить производительность за счет соответствующего использования объединений, например, что-то вроде следующего должно дать тот же результат:

SELECT 
    Periods.LTM_Start, 
    Periods.Period_End, 
    Periods.sa_account, 
    SUM
    (
        IIF
        (
            [Sales Transactions].sa_trdate >= Periods.[LTM_Start] AND 
            [Sales Transactions].sa_trdate <= Periods.[Period_End],
            [Sales Transactions].sa_trvalue,
            0
        )
    ) AS Total
FROM
    Periods LEFT JOIN [Sales Transactions] 
    ON [Sales Transactions].sa_account = Periods.[sa_account]
GROUP BY 
    Periods.LTM_Start, Periods.Period_End, Periods.sa_account;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...