2009-04-24 22 views
5

Estoy tratando de actualizar todos los registros en una tabla con los valores encontrados en otra tabla.Access DB update one table with value from another

He intentado muchas versiones de la misma consulta básica y siempre sale el mismo mensaje de error:

operación debe usar una consulta actualizable .

¿Alguna idea de por qué esta consulta no funcionará en Access DB?

UPDATE inventoryDetails as idet 
SET idet.itemDesc = 
(
    SELECT bomItemDesc 
    FROM BOM_TEMPLATES as bt 
    WHERE bt.bomModelNumber = idet.modelNumber 
) 

También probamos esto porque me di cuenta de que, desde la segunda tabla tiene varios registros del número de modelo para cada ModelNumber - y sólo necesita la primera descripción del primer registro encontrado para cada número de modelo.

UPDATE inventoryDetails as idet 
SET idet.item_desc = 
(
    SELECT TOP 1 bomItemDescription 
    FROM BOM_TEMPLATES as bt 
    WHERE bt.bomModelNumber = idet.modelNumber 
) 

... sigue recibiendo el mismo error.

+0

Las uniones son siempre mejores como punto de partida que una subconsulta en Access/Jet porque están mejor optimizadas (aunque muchas subconsultas están bien optimizadas, pero no todos los tipos de ellas). –

+1

El mensaje de error, "La operación debe usar una consulta actualizable" puede sonar un poco extraño; Quiero decir, la (sub) consulta no es la parte que se está actualizando, ¿verdad? Lo que necesita comprender es que en Access-speak todos los SQL DML se denominan 'consultas', p. se obtiene gente que dice oxímoron aparente, como "una consulta de actualización" cuando se refieren a una declaración SQL * de actualización *. – onedaywhen

+0

... y esas personas no son realmente culpables: la documentación de Access fomenta esto mediante el uso de dicha terminología a lo largo de, por ejemplo, 'apend query' significa INSERT INTO * statement *. – onedaywhen

Respuesta

10

Usted tiene que usar una combinación

UPDATE inventoryDetails 
INNER JOIN BOM_TEMPLATES ON inventoryDetails.modelNumber = BOM_TEMPLATES.bomModelNumber 
SET inventoryDetails.itemDesc = [bomItemDesc]; 
+1

Gracias. Creo que estaba haciendo UPDATE, SET, INNER JOIN (en ese orden). – m42

0

intento:

update idet 
SET idet.itemDesc = bt.bomItemDesc 
from inventoryDetails as idet 
    inner join BOM_TEMPLATES as bt 
      on bt.bomModelNumber = idet.modelNumber 

Así es como lo escribiría para el servidor SQL. Hope Access entiende el mismo comando.

+0

Las consultas de acceso y servidor Sql raramente tienen la misma sintaxis ... –

+0

El acceso se bloquea comenzando por la parte FROM. Probé varias versiones similares a esta. – m42

2

Any thoughts on why this query won't work in Access DB?

La respuesta es, porque la sintaxis ACE/Jet SQL no es compatible con SQL-92 (¡incluso cuando está en su modo de consulta ANSI-92!).

Supongo que la tuya es una subconsulta escalar. Este constructo simplemente no es compatible con ACE/Jet.

ACE/Jet tiene su propia sintaxis peculiar y defectuosa UPDATE..JOIN, defectuosa porque el motor no fuerza los valores de JOIN ed a escalar y es libre de usar silenciosamente un valor arbitrario. Es diferente de nuevo de la propia sintaxis UPDATE..JOIN de SQL Server, pero al menos SQL Server admite la subconsulta escalar estándar como alternativa. ACE/Jet lo obliga a aprender sus peculiares formas no portátiles o utilizar un producto SQL alternativo.

Lo sentimos, suena negativo: el motor ACE/Jet es una gran pieza de software, pero la sintaxis UPDATE es absolutamente fundamental y el hecho de que no ha cambiado desde que el estándar SQL-92 realmente muestra su edad.