Access 2010 SQL запрос выбора внутреннего соединения с временными таблицами - PullRequest
0 голосов
/ 29 июня 2018

В Access 2013 с использованием VBA я выполняю SQL-запрос, в котором таблица (CUSTOMERS_TEMP) имеет значение month_total, которое представляет собой сумму sales_price во временной таблице (SALESHIST), взятую из таблицы SALESHIST_TEMP. Я не уверен, почему это не работает.

Dim SQL As String
SQL = "Update CUST " _
    & "SET CUST.Monthly_Total = SALESHIST.Monthly_Total " _
    & "FROM CUSTOMERS_TEMP AS CUST " _
    & "INNER JOIN (SELECT KEY, SUM(SALES_PRICE) AS MONTHLY_TOTAL FROM SALESHISTORY_TEMP GROUP BY KEY) AS SALESHIST " _
    & "ON CUST.Key = SALESHIST.Key "
DoCmd.RunSQL SQL

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Рассмотрим Агрегат домена DSum для обновляемого запроса. Также рассмотрите возможность сохранения вашего запроса как хранимого объекта в базе данных, так как он более эффективен, так как механизм доступа может скомпилировать его для лучшего плана выполнения. Кроме того, избегайте Ключ для имени столбца, так как это зарезервированное слово .

SQL

UPDATE CUSTOMERS_TEMP CUST 
SET CUST.Monthly_Total = DSum("SALES_PRICE", "SALESHISTORY_TEMP", 
                              "[Key]='" & CUST.[Key] & "'")

* VBA 1015 *

CurrentDb.Execute "mySavedQuery", dbFailOnError

Наконец, пересмотрите сохранение агрегированных данных в исходных таблицах, так как вы всегда можете запрашивать их по мере необходимости и избегать ресурсов хранения.

0 голосов
/ 29 июня 2018

В MS Access синтаксис для UPDATE / JOIN отличается от SQL Server.

Похоже:

Update CUSTOMERS_TEMP AS CUST INNER JOIN
       (SELECT KEY, SUM(SALES_PRICE) AS MONTHLY_TOTAL
        FROM SALESHISTORY_TEMP
        GROUP BY KEY
       ) AS SALESHIST
       ON CUST.Key = SALESHIST.Key
    SET CUST.Monthly_Total = SALESHIST.Monthly_Total;

Вы также можете написать это как:

Update CUSTOMERS_TEMP AS CUST
    SET CUST.Monthly_Total = (SELECT SUM(SALES_PRICE) AS MONTHLY_TOTAL
                              FROM SALESHISTORY_TEMP
                              WHERE SALESHISTORY_TEMP.Key = CUST.Key
                             )
    WHERE EXISTS (SELECT 1
                  FROM SALESHISTORY_TEMP
                  WHERE SALESHISTORY_TEMP.Key = CUST.Key
                 );
...