Pregunta

¿Cómo puedo UPDATE un campo de una tabla con el resultado de una consulta SELECT en Microsoft Access 2007.

Aquí está la consulta de selección:

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;

Y aquí está la Consulta de actualización:

UPDATE FUNCTIONS

 SET FUNCTIONS.Func_TaxRef = [Result of Select query]
¿Fue útil?

Solución

Bueno, parece que el acceso no se puede hacer agregados en las consultas de actualización. Pero puede hacer agregados en las consultas SELECT. Por lo tanto crear una consulta con una definición como:

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

Y guardarlo como YourQuery. Ahora tenemos que trabajar alrededor de otra restricción de acceso. consultas de actualización no pueden operar en las consultas, pero pueden operar en varias tablas. Así que vamos a convertir la consulta en una tabla con una consulta de tabla:

SELECT YourQuery.* 
INTO MinOfTax_Code
FROM YourQuery

Esto almacena el contenido de la vista en una tabla llamada MinOfTax_Code. Ahora usted puede hacer una consulta UPDATE:

UPDATE MinOfTax_Code 
INNER JOIN Functions ON MinOfTax_Code.func_id = Functions.Func_ID 
SET Functions.Func_TaxRef = [MinOfTax_Code].[MinOfTax_Code]

Hacer SQL en Access es un poco exagerado, me vería en SQL Server Express Edition para su proyecto!

Otros consejos

escribí sobre algunas de las limitaciones de la de subconsultas correlacionadas en Access / JET SQL hace un tiempo, y tomó nota de la sintaxis para la unión de varias tablas para las actualizaciones de SQL. Con base en esa información y algunas pruebas rápida, no creo que haya ninguna manera de hacer lo que quiera con acceso / JET en una sola instrucción SQL UPDATE. Si se pudiera, la declaración podría decir algo como esto:

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

Como alternativa, Acceso / JET veces le permitirá obtener de distancia con el ahorro de una sub consulta como una consulta independiente y luego unirse a él en la instrucción UPDATE de una manera más tradicional. Así, por ejemplo, si salvamos la subconsulta SELECT anterior FUNCTIONS_TAX como una consulta independiente nombrado, entonces sería la instrucción UPDATE:

UPDATE FUNCTIONS
INNER JOIN FUNCTIONS_TAX
ON FUNCTIONS.Func_ID = FUNCTIONS_TAX.Func_ID
SET FUNCTIONS.Func_TaxRef = FUNCTIONS_TAX.MinOfTax_Code

Sin embargo, esto todavía no funciona.

Creo que la única manera de hacer este trabajo es mover la selección y la agregación del valor mínimo Tax_Code fuera de banda. Usted puede hacer esto con una función de VBA, o más fácilmente utilizando la función DBúsq acceso. Guarde el GRUPO POR subconsulta anterior para una consulta con nombre FUNCTIONS_TAX separada y volver a escribir la instrucción UPDATE como:

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

Tenga en cuenta que la función DBúsq impide que esta consulta sea utilizado fuera de acceso, por ejemplo a través de OLEDB de JET. Además, el cumplimiento de este enfoque puede ser bastante terrible dependiendo del número de filas que se orienta, como la sub consulta se ejecuta para cada fila FUNCIONES (porque, por supuesto, ya no es correlacionada, que es el punto entero con el fin para que funcione).

Buena suerte!

He tenido un problema similar. Yo quería encontrar una cadena en una columna y poner ese valor en otra columna en la misma mesa. La instrucción de selección a continuación se encuentra el texto dentro de los parens.

Cuando creé la consulta en Access que he seleccionado todos los campos. En la vista SQL para esa consulta, que sustituyó a la mytable.myfield para el campo que quería tener el valor desde el interior de los parens con

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

Me encontré con una consulta de creación de tabla. La consulta de creación de tabla tiene todos los campos con la sustitución arriba y termina con INTO NameofNewTable FROM mytable

¿Esto funciona? No probado, pero debe conseguir el punto a través.

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;
)

Básicamente para cada fila de funciones, el sub consulta determina el código fiscal de corriente mínima y establece FUNCTIONS.Func_TaxRef a ese valor. Esto es suponiendo que FUNCTIONS.Func_ID es una clave principal o único.

Yo quería añadir una respuesta más que utiliza una función de VBA, pero sí hacer el trabajo en una instrucción SQL. Sin embargo, puede ser lento.

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)

Sé que este tema es viejo, pero pensé que podría añadir algo a él.

No podía hacer una actualización con Los trabajos de consulta utilizando SQL en Microsoft Access 2010. He utilizado la sugerencia de Tomalak para hacer este trabajo. Tenía una captura de pantalla, pero al parecer soy demasiado de un Novato en este sitio para poder publicarlo.

yo era capaz de hacer esto utilizando la herramienta de diseño de consulta, pero como yo estaba buscando a una consulta de actualización exitosa confirmado, acceso no era capaz de mostrarme el SQL que lo han hecho posible. Así que no podía hacer este trabajo con el código SQL solo.

I creado y guardado mi consulta de selección como una consulta independiente. En la herramienta de diseño de consulta, añadí la mesa que estoy tratando de actualizar el la consulta de selección que había ahorrado (I poner la llave única en la consulta de selección, así que tenía un vínculo entre ellos). Así como había sugerido Tomalak, he cambiado el tipo de consulta para actualizar. Entonces sólo tenía que elegir los campos (y designar a la mesa) que estaba tratando de actualizar. En el "Actualizar en" campos, he escrito en el nombre de los campos de la consulta de selección que había traído en.

Este formato fue un éxito y ha actualizado la tabla original.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top