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).
¡Gracias, esto me ayudó mucho! –
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". –