Операция Access должна использовать обновляемый запрос

#sql #sql-update #ms-access-2013

#sql #sql-update #ms-access-2013

Вопрос:

Я ломал голову, пытаясь заставить это работать весь день, и это почти получилось, но я получаю страшное «Операция должна использовать обновляемый запрос». После нескольких изменений и перезаписей я получил следующее:

 UPDATE
    Users AS U
  INNER JOIN
    (SELECT
        UP.[Agent ID] AS AgentID,
        UP.[Last Name] AS LastName,
        UP.[First Name] AS FirstName,
        UP.[Team ID] AS TeamID,
        UP.[Security Profile ID] AS SecProfID,
        E.EmailID,
        UP.[Username] AS [Username],
        IIF(UP.Status = 'Active', 1,0) AS [Status],
        L.LocationID,
        Nz(DD.DateID, 1) AS HireDate,
        IIF(UP.[Rehire Status] = 'Eligible', 1, 0) AS RehireEligible,
        (SELECT 
             D.DateID 
         FROM 
             DateCodes AS D 
         WHERE
             D.DateValue = Format(Now(), "Short Date")) AS ModifiedDate
    FROM
        ((UsersPaste AS UP 
        LEFT JOIN
          DateCodes AS DD
        ON UP.[Hire Date] = DD.DateValue)
       INNER JOIN
         EmailAddresses AS E
       ON UP.[Email Address] = E.EmailAddress)
      INNER JOIN
         (SELECT 
              L.LocationID, T.TimeZone, L.Country, L.State, L.City 
          FROM 
              Locations AS L 
            INNER JOIN 
              TimeZones AS T 
            ON L.TimeZoneID = T.TimeZoneID) AS LL
      ON UP.[Time Zone] = LL.TimeZone 
        AND UP.Country = LL.Country 
        AND UP.State = LL.State 
        AND UP.City = LL.City) AS UU
  ON U.AgentID = UU.AgentID 
SET
    U.LastName = UU.LastName,
    U.FirstName = UU.FirstName,
    U.TeamID = UU.TeamID,
    U.SecProfID = UU.SecProfID,
    U.EmailID = UU.EmailID,
    U.[Username] = UU.[Username],
    U.[Status] = UU.[Status],
    U.LocationID = UU.LocationID,
    U.HireDate = UU.HireDate,
    U.RehireEligible = UU.RehireEligible,
    U.ModifiedDate = UU.ModifiedDate
 

Теперь внутренний запрос Select формирует UU вывод о том, как именно Users настроена таблица. На мой взгляд, и поправьте меня, если я ошибаюсь, это должно работать точно так же, как если бы я присоединялся непосредственно к другой таблице.

Нужно ли мне создавать фактическую таблицу и вставлять записи, сформированные UU в эту таблицу, а затем обновлять на основе новой таблицы? Если мне нужно, я это сделаю, но я бы предпочел этого не делать. Кто-нибудь знает какой-либо другой способ или что мне нужно сделать, чтобы заставить это работать?

Ответ №1:

В вашем случае, да, я думаю, вам нужно будет преобразовать ваш подзапрос в запрос make-table

 SELECT ... INTO UU FROM ...
 

и затем ваш запрос на ОБНОВЛЕНИЕ как

 UPDATE Users AS U INNER JOIN UU ON ...
 

В простых случаях проблемы с «обновляемым запросом» можно избежать, используя агрегированные функции домена. Например, следующий запрос отказывается выполняться («Операция должна использовать обновляемый запрос».)

 UPDATE
    Donors
    INNER JOIN
    (
        SELECT 
            DonorID,
            SUM(Amount) AS SumOfAmount
        FROM Donations
        GROUP BY DonorID
    ) AS totals
        ON Donors.ID = totals.DonorID
SET
    Donors.TotalAmount = totals.SumOfAmount
 

но работает следующий запрос

 UPDATE Donors
SET Donors.TotalAmount = DSum("Amount", "Donations", "DonorID=" amp; ID)
 

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