Используйте ВЫБОР в Запросе на обновление

Если все три реализации идентичны, просто поместите этот код в common. expect/actual используется только для вещей, которые различны на разных платформах

13
задан Juan Mellado 1 May 2012 в 13:56
поделиться

3 ответа

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

19
ответ дан 1 December 2019 в 21:25
поделиться

Это работает? Не проверено, но суть должна быть понятна.

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

0
ответ дан 1 December 2019 в 21:25
поделиться

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

Удачи!

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

Удачи!

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

Удачи!

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

Удачи!

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

Удачи!

Вы можете сделать это с помощью функции 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 (потому что, конечно, он больше не коррелирован, и все дело в порядке чтобы он работал).

Удачи!

Вы можете сделать это с помощью функции 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 (потому что, конечно, он больше не коррелирован, и все дело в порядке чтобы он работал).

Удачи!

UPDATE FUNCTIONS
SET Func_TaxRef = DLookup(
  "MinOfTax_Code", 
  "FUNCTIONS_TAX", 
  "Func_ID = '" & Func_ID & "'"
)

Обратите внимание, что функция DLookup предотвращает использование этого запроса вне Access, например, через JET OLEDB. Кроме того, производительность этого подхода может быть довольно ужасной в зависимости от того, сколько строк вы нацеливаете, поскольку подзапрос выполняется для каждой строки FUNCTIONS (потому что, конечно, он больше не коррелирован, и все дело в порядке чтобы он работал).

Удачи!

UPDATE FUNCTIONS
SET Func_TaxRef = DLookup(
  "MinOfTax_Code", 
  "FUNCTIONS_TAX", 
  "Func_ID = '" & Func_ID & "'"
)

Обратите внимание, что функция DLookup предотвращает использование этого запроса вне Access, например, через JET OLEDB. Кроме того, производительность этого подхода может быть довольно ужасной в зависимости от того, сколько строк вы нацеливаете, поскольку подзапрос выполняется для каждой строки FUNCTIONS (потому что, конечно, он больше не коррелирован, и все дело в порядке чтобы он работал).

Удачи!

6
ответ дан 1 December 2019 в 21:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: