2009-09-03 10 views
13

Desidero eseguire il porting di questa query SQL, che funziona perfettamente su SQL Server, MySQL e Oracle, in un database di Access. Come lo faccio? In questo momento mi viene richiesto un ID_azienda per qualche motivo.Come si esegue la query di aggiornamento con sottoquery in Access?

Modifica: Stavo ricevendo il prompt perché ho dimenticato di creare prima la colonna Company_ID in VendorRegKeys. Ora ricevo l'errore "L'operazione deve utilizzare una query aggiornabile".

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

Aggiornamento: ho trovato questo a lavorare in base alla risposta JuniorFlip s':

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

Grazie, questo mi ha aiutato molto! –

+0

Nota: se gli utenti sono una query anziché una tabella e quindi non aggiornabili, il risultato è "l'operazione deve utilizzare una query aggiornabile". –

risposta

11

che potrebbero essere causa company_id non è un campo esistente in VendorRegKeys o utenti.

EDIT:

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

oops, ID_azienda non esisteva in VendorRegKeys. Ma dopo averlo aggiunto, ora ricevo "L'operazione deve utilizzare una query aggiornabile" – Kip

+0

non ha visto che hai modificato in una query che funziona ... accettando la tua risposta dal momento che funziona effettivamente. Grazie! – Kip

8

si potrebbe provare questa risposta diritta uno

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

hmm .. che dà errore: Errore di sintassi (operatore mancante) nell'espressione di query 'b.company_id da vendorRegkeys a' – Kip

+1

ho capito che funziona con una versione leggermente modificata di questo, aggiornata nella domanda. Grazie! – Kip

8

: 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).

+1

grazie per tutte le informazioni. non ho mai preso l'accesso seriamente, ma la direzione dice che dobbiamo supportarlo comunque. : -/Almeno in questo caso c'è una sintassi alternativa che funziona. – Kip

+0

+1 per "ma la direzione dice ..." – wkschwartz

Problemi correlati