: non si può. Il semplice motore di database di Access non supporta la sintassi di subquery scalare SQL-92 vanilla anche quando si trova nella cosiddetta modalità di interrogazione ANSI-92.
Si è costretti a utilizzare la propria sintassi proprietaria che non applica il requisito scalare, ovvero non è sicuro e selezionerà un valore in modo arbitrario e silenzioso **. Inoltre, al di là dei semplici costrutti non funziona affatto, in particolare dove la tua subquery (se ti è stato permesso di usarne una in primo luogo) usa una funzione impostata (MAX
, SUM
, ecc.) - vedi this article per alcuni soluzioni alternative davvero insoddisfacenti .
Mi spiace essere negativo, ma questa è una sintassi di base e non riesco a capire perché il team di Access non sia ancora riuscito a risolverlo. È il numero indiscusso uno dei motivi per cui non posso più prendere sul serio il motore di database di Access.
per illustrare il comportamento pericoloso di Access proprietaria UPDATE..JOIN..Set
sintassi
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;
Quando si esegue l'istruzione di aggiornamento in Access, l'interfaccia utente si
You are about to update 2 row(s).
avverte nonostante il fatto c'è solo una riga nella tabella VendorRegKeys
!
Quello che succede in pratica è solo uno dei valori che useremo per aggiornare la colonna in quella singola riga, senza un modo affidabile di prevedere quale sarà.
Con la sintassi di subquery scalare di SQL standard, si otterrebbe un errore e l'istruzione non riuscirebbe ad essere eseguita, che è probabilmente la funzionalità desiderata (la sintassi dello standard SQL MERGE
si comporta anche in questo modo).
Grazie, questo mi ha aiutato molto! –
Nota: se gli utenti sono una query anziché una tabella e quindi non aggiornabili, il risultato è "l'operazione deve utilizzare una query aggiornabile". –