Используйте SELECT внутри запроса UPDATE - PullRequest
13 голосов
/ 16 мая 2009

Как мне 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 FUNCTIONS

 SET FUNCTIONS.Func_TaxRef = [Result of Select query]

Ответы [ 6 ]

18 голосов
/ 16 мая 2009

Что ж, похоже, 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 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 для вашего проекта!

6 голосов
/ 16 мая 2009

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

Удачи!

1 голос
/ 30 июля 2011

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

Когда я создал запрос в Access, я выбрал все поля. В представлении SQL для этого запроса я заменил mytable.myfield для поля, в котором я хотел получить значение внутри паренов, на

SELECT Left(Right(OtherField,Len(OtherField)-InStr((OtherField),"(")), 
            Len(Right(OtherField,Len(OtherField)-InStr((OtherField),"(")))-1) 

Я выполнил запрос на создание таблицы. Запрос make-таблицы содержит все поля с вышеуказанной заменой и заканчивается на INTO NameofNewTable FROM mytable

0 голосов
/ 17 марта 2014

Я знаю, что эта тема старая, но я подумала, что могу кое-что добавить к ней.

Я не смог заставить запрос Update with Select работать с использованием SQL в MS Access 2010. Я использовал предложение Tomalak, чтобы сделать эту работу. У меня был скриншот, но я явно слишком новичок на этом сайте, чтобы его можно было опубликовать.

Мне удалось сделать это с помощью инструмента Query Design, но даже когда я смотрел на подтвержденный успешный запрос на обновление, Access не смог показать мне SQL, который это сделал. Поэтому я не мог заставить это работать с одним только кодом SQL.

Я создал и сохранил свой запрос на выборку как отдельный запрос. В инструменте Query Design я добавил таблицу, в которой я пытаюсь обновить сохраненный запрос на выборку (я вставил уникальный ключ в запрос на выборку, чтобы между ними была ссылка). Как и предложил Томалак, я изменил Тип запроса на Обновление. Затем мне просто нужно было выбрать поля (и назначить таблицу), которые я пытался обновить. В полях «Обновить до» я ввел имя поля из запроса на выборку, который я ввел.

Этот формат был успешным и обновил исходную таблицу.

0 голосов
/ 04 июля 2013

Я хотел добавить еще один ответ, который использует функцию 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)
0 голосов
/ 16 мая 2009

Это работает? Не проверенный, но должен получить точку зрения.

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 является первичным или уникальным ключом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...