Использовать SELECT внутри запроса UPDATE
Как я могу UPDATE
поле таблицы с результатом запроса SELECT
в Microsoft Access 2007.
Здесь выберите "Выбрать запрос":
SELECT Min(TAX.Tax_Code) AS MinOfTax_Code
FROM TAX, FUNCTIONS
WHERE (((FUNCTIONS.Func_Pure)<=[Tax_ToPrice]) AND ((FUNCTIONS.Func_Year)=[Tax_Year]))
GROUP BY FUNCTIONS.Func_ID;
И здесь Update Query:
UPDATE FUNCTIONS
SET FUNCTIONS.Func_TaxRef = [Result of Select query]
Ответы
Ответ 1
Ну, похоже, что Access не может выполнять агрегаты в запросах UPDATE. Но он может выполнять агрегаты в запросах SELECT. Поэтому создайте запрос с определением вроде:
SELECT func_id, min(tax_code) as MinOfTax_Code
FROM Functions
INNER JOIN Tax
ON (Functions.Func_Year = Tax.Tax_Year)
AND (Functions.Func_Pure <= Tax.Tax_ToPrice)
GROUP BY Func_Id
И сохраните его как YourQuery. Теперь нам нужно обойти еще одно ограничение доступа. Запросы UPDATE не могут работать с запросами, но они могут работать на нескольких таблицах. Итак, включите запрос в таблицу с запросом Make Table:
SELECT YourQuery.*
INTO MinOfTax_Code
FROM YourQuery
Сохраняет содержимое представления в таблице с именем MinOfTax_Code. Теперь вы можете выполнить запрос UPDATE:
UPDATE MinOfTax_Code
INNER JOIN Functions ON MinOfTax_Code.func_id = Functions.Func_ID
SET Functions.Func_TaxRef = [MinOfTax_Code].[MinOfTax_Code]
Выполнение SQL в Access немного растянуто, я бы заглянул в Sql Server Express Edition для вашего проекта!
Ответ 2
Я писал о некоторых из ограничениях коррелированных подзапросов в Access/JET SQL некоторое время назад и отметил синтаксис объединения нескольких таблиц для SQL UPDATE. Основываясь на этой информации и некоторых быстрых тестах, я не верю, что есть какой-либо способ сделать то, что вы хотите, с помощью Access/JET в одном выражении SQL UPDATE. Если бы вы могли, выражение читало бы что-то вроде этого:
UPDATE FUNCTIONS A
INNER JOIN (
SELECT AA.Func_ID, Min(BB.Tax_Code) AS MinOfTax_Code
FROM TAX BB, FUNCTIONS AA
WHERE AA.Func_Pure<=BB.Tax_ToPrice AND AA.Func_Year= BB.Tax_Year
GROUP BY AA.Func_ID
) B
ON B.Func_ID = A.Func_ID
SET A.Func_TaxRef = B.MinOfTax_Code
В качестве альтернативы Access/JET иногда позволяет вам уйти с сохранением подзапроса в качестве отдельного запроса, а затем присоединить его в инструкции UPDATE более традиционным способом. Так, например, если мы сохранили подзапрос SELECT выше как отдельный запрос с именем FUNCTIONS_TAX, то оператор UPDATE будет выглядеть следующим образом:
UPDATE FUNCTIONS
INNER JOIN FUNCTIONS_TAX
ON FUNCTIONS.Func_ID = FUNCTIONS_TAX.Func_ID
SET FUNCTIONS.Func_TaxRef = FUNCTIONS_TAX.MinOfTax_Code
Однако это все еще не работает.
Я считаю, что единственный способ сделать эту работу - переместить выделение и агрегацию минимального значения Tax_Code вне диапазона. Вы можете сделать это с помощью функции VBA или более легко использовать функцию Access DLookup. Сохраните подзапрос GROUP BY выше в отдельный запрос с именем FUNCTIONS_TAX и перепишите инструкцию UPDATE как:
UPDATE FUNCTIONS
SET Func_TaxRef = DLookup(
"MinOfTax_Code",
"FUNCTIONS_TAX",
"Func_ID = '" & Func_ID & "'"
)
Обратите внимание, что функция DLookup не позволяет использовать этот запрос вне Access, например, через JET OLEDB. Кроме того, производительность этого подхода может быть довольно ужасной в зависимости от того, сколько строк вы нацеливаете, поскольку подзапрос выполняется для каждой строки FUNCTIONS (потому что, конечно, он больше не коррелирован, что является целым рядом для его работы).
Удачи!
Ответ 3
У меня была аналогичная проблема. Я хотел найти строку в одном столбце и поместить это значение в другой столбец в той же таблице. Вышеуказанный оператор select находит текст внутри parens.
Когда я создал запрос в Access I, вы выбрали все поля. В представлении SQL для этого запроса я заменил mytable.myfield для поля, в котором я хотел получить значение изнутри parens с помощью
SELECT Left(Right(OtherField,Len(OtherField)-InStr((OtherField),"(")),
Len(Right(OtherField,Len(OtherField)-InStr((OtherField),"(")))-1)
Я выполнил запрос таблицы make. Запрос таблицы make содержит все поля с указанной заменой и заканчивается на INTO NameofNewTable FROM mytable
Ответ 4
Это работает? Непроверенный, но должен получить точку.
UPDATE FUNCTIONS
SET Func_TaxRef =
(
SELECT Min(TAX.Tax_Code) AS MinOfTax_Code
FROM TAX, FUNCTIONS F1
WHERE F1.Func_Pure <= [Tax_ToPrice]
AND F1.Func_Year=[Tax_Year]
AND F1.Func_ID = FUNCTIONS.Func_ID
GROUP BY F1.Func_ID;
)
В основном для каждой строки в FUNCTIONS подзапрос определяет минимальный текущий налоговый код и устанавливает значение FUNCTIONS.Func_TaxRef этому значению. Предполагается, что FUNCTIONS.Func_ID является основным или уникальным ключом.
Ответ 5
Я хотел добавить еще один ответ, который использует функцию VBA, но он выполняет задание в одном выражении SQL. Хотя, это может быть медленным.
UPDATE FUNCTIONS
SET FUNCTIONS.Func_TaxRef = DLookUp("MinOfTax_Code", "SELECT
FUNCTIONS.Func_ID,Min(TAX.Tax_Code) AS MinOfTax_Code
FROM TAX, FUNCTIONS
WHERE (((FUNCTIONS.Func_Pure)<=[Tax_ToPrice]) AND ((FUNCTIONS.Func_Year)=[Tax_Year]))
GROUP BY FUNCTIONS.Func_ID;", "FUNCTIONS.Func_ID=" & Func_ID)
Ответ 6
Я знаю, что эта тема старая, но я думал, что могу что-то добавить к ней.
Я не смог выполнить обновление с помощью запроса Select с использованием SQL в MS Access 2010. Я использовал предложение Tomalak, чтобы сделать эту работу. У меня был снимок экрана, но я, видимо, слишком много нового на этом сайте, чтобы опубликовать его.
Я смог сделать это с помощью инструмента Query Design, но даже когда я рассматривал подтвержденный успешный запрос на обновление, Access не смог показать мне SQL, из-за которого это произошло. Поэтому я не мог выполнить эту работу с кодом SQL.
Я создал и сохранил свой запрос на выбор как отдельный запрос. В инструменте Query Design я добавил таблицу, в которой я пытаюсь обновить выбранный запрос, который я сохранил (я поместил уникальный ключ в запрос выбора, чтобы у него была связь между ними). Так же, как предложил Томалак, я изменил тип запроса на обновление. Затем мне просто нужно было выбрать поля (и обозначить таблицу), которые я пытался обновить. В полях "Обновить до" я набрал имя полей из запроса выбора, который я привез.
Этот формат был успешным и обновил исходную таблицу.