2009-09-03 14 views
13

Quiero portar esta consulta SQL, que funciona bien en SQL Server, MySQL y Oracle, a una base de datos de Access. ¿Cómo puedo hacer eso? Ahora mismo me pide un ID de empresa por algún motivo.¿Cómo realizo la consulta de actualización con subconsulta en Access?

Editar: me estaba poniendo el símbolo porque se me olvidó para crear la primera columna de Company_id en VendorRegKeys. Ahora recibo el error "La operación debe usar una consulta actualizable".

UPDATE VendorRegKeys 
    SET Company_ID = (SELECT Users.Company_ID 
        FROM Users 
        WHERE Users.User_ID = VendorRegKeys.CreatedBy_ID) 

actualización: Me pareció que este trabajo basado en la respuesta JuniorFlip 's:

UPDATE VendorRegKeys, Users 
SET VendorRegKeys.Company_ID = Users.Company_ID 
WHERE VendorRegKeys.CreatedBy_ID = Users.User_ID 
+0

¡Gracias, esto me ayudó mucho! –

+0

Nota: si los usuarios son una consulta en lugar de una tabla y, por lo tanto, no actualizable, el resultado es "La operación debe usar una consulta actualizable". –

Respuesta

11

Esto podría ser debido Company_id no es un campo existente en VendorRegKeys o usuarios.

EDIT:

UPDATE VendorRegKeys 
INNER JOIN Users ON Users.User_ID = VendorRegKeys.CreatedBy_ID 
SET VendorRegKeys.Company_ID = Users.Company_ID 
+0

oops, company_ID no existía en VendorRegKeys. Pero después de agregarlo, ahora obtengo "La operación debe usar una consulta actualizable" – Kip

+0

no vi que había editado en una consulta que funciona ... aceptando su respuesta, ya que realmente funciona. ¡Gracias! – Kip

8

que podría probar este

update a 
set a.company_id = b.company_id 
from vendorRegkeys a, users b 
where a.createdby_id = b.user_id 
+1

hmm .. que da error: Error de sintaxis (operador faltante) en la expresión de consulta 'b.company_id de vendorRegkeys a' – Kip

+1

lo tengo que trabajar con una versión ligeramente modificada de esto, actualizada en la pregunta. ¡Gracias! – Kip

8

respuesta clara: no se puede. El motor de base de datos de Access simple no es compatible con la sintaxis de subconsulta escalar SQL-92 vainilla, incluso cuando está en su propio modo de consulta ANSI-92.

Está obligado a utilizar su propia sintaxis patentada que no aplica el requisito escalar, es decir, no es seguro y elegirá un valor de forma arbitraria y silenciosa **. Además, más allá de constructos simples, no funciona en absoluto, especialmente donde su subconsulta (si se le permitió usar uno en primer lugar) usa una función de conjunto (MAX, SUM, etc.) - vea this article para algunas soluciones realmente insatisfactorias .

Lamento ser negativo, pero esta es una sintaxis muy básica y no puedo entender por qué el equipo de Access aún no se ha encargado de solucionarlo. Es la razón número uno indiscutible por la que ya no puedo tomar en serio el motor de base de datos Access.


Para demostrar el comportamiento inseguro del acceso exclusivo UPDATE..JOIN..Set sintaxis

CREATE TABLE Users 
( 
    User_ID CHAR(3) NOT NULL, 
    Company_ID CHAR(4) NOT NULL, 
    UNIQUE (Company_ID, User_ID)); 

CREATE TABLE VendorRegKeys 
    CreatedBy_ID CHAR(3) NOT NULL UNIQUE, 
    Company_ID CHAR(4)); 

INSERT INTO Users VALUES ('Kip', 'MSFT'); 
INSERT INTO Users VALUES ('Kip', 'AAPL'); 

INSERT INTO VendorRegKeys VALUES ('Kip', NULL); 

UPDATE VendorRegKeys 
INNER JOIN Users ON Users.User_ID = VendorRegKeys.CreatedBy_ID 
SET VendorRegKeys.Company_ID = Users.Company_ID; 

Cuando se ejecuta la instrucción de actualización dentro de Access, la interfaz de usuario advierte que

You are about to update 2 row(s).

a pesar del hecho de que sólo hay una fila en la tabla VendorRegKeys!

Lo que sucede en la práctica es solo uno de los valores que usaremos para actualizar la columna en esa única fila, sin una manera confiable de predecir cuál será.

Con la sintaxis de subconsulta escalar de SQL estándar, se obtendría un error y la sentencia no se ejecutaría, que es posiblemente la funcionalidad deseada (la sintaxis de MERGE de Standard SQL también se comporta de esta manera).

+1

gracias por toda la información. Nunca tomé en serio el acceso, pero la gerencia dice que tenemos que apoyarlo de todos modos. : -/Al menos en este caso hay una sintaxis alternativa que funciona. – Kip

+0

+1 para "pero la gerencia dice ..." – wkschwartz

Cuestiones relacionadas