#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)
Однако ваш случай достаточно сложен, поэтому использование временной таблицы, вероятно, является наилучшим подходом.