2012-01-31 9 views
8

Prerequisiti: In MS Access 2010 creare le seguenti tabelle:Accesso MS: la clausola WHERE-EXISTS non funziona sulle viste?

CREATE TABLE ATBL(ID INT); 
INSERT INTO ATBL(ID) VALUES (1); 
INSERT INTO ATBL(ID) VALUES (2); 
INSERT INTO ATBL(ID) VALUES (3); 

CREATE TABLE BTBL(ID INT); 
INSERT INTO BTBL(ID) VALUES (1); 
INSERT INTO BTBL(ID) VALUES (2); 

Crea anche una vista chiamata BView che utilizza la seguente istruzione SELECT:

SELECT A.ID FROM ATBL AS A WHERE A.ID = 1 OR A.ID = 2 

Ora BView dovrebbe avere lo stesso contenuto BTBL. Tuttavia i seguenti due query restituiranno risultati diversi:

SELECT A.ID FROM ATBL AS A WHERE EXISTS (SELECT 1 FROM BTBL AS B WHERE B.ID=A.ID) 
SELECT A.ID FROM ATBL AS A WHERE EXISTS (SELECT 1 FROM BVIEW AS B WHERE B.ID=A.ID) 

La prima query restituisce due record (1 e 2), ma la seconda query restituisce tutti i record da ATBL. Cosa c'è che non va qui? Mi sto perdendo qualcosa?

+0

FWIW il codice funziona come previsto su SQL Server. – onedaywhen

risposta

6

Una vista è davvero un'istruzione SQL SELECT salvata. Almeno, questo è ciò che una vista salvata in MS Access è. E tu usi le stesse variabili interne A e B. IMHO, si stanno mescolando. L'ultima riga sembra davvero come

SELECT A.ID FROM ATBL AS A WHERE EXISTS (SELECT 1 FROM (SELECT A.ID FROM ATBL AS A WHERE A.ID = 1 OR A.ID = 2) AS B WHERE B.ID=A.ID) 

tenta di modificare alcuni nomi interni, ad esempio:

SELECT AA.ID FROM ATBL AS AA WHERE AA.ID = 1 OR AA.ID = 2 

Così, l'ultima riga sarà come

SELECT A.ID FROM ATBL AS A WHERE EXISTS (SELECT 1 FROM (SELECT AA.ID FROM ATBL AS AA WHERE AA.ID = 1 OR AA.ID = 2) AS B WHERE B.ID=A.ID) 

Quindi, come si vede qui, anche MS Access non sa come isolare gli alias!

+0

Ok, ti ​​ho sbagliato la prima volta, ora che vedo il tuo SQL capisco cosa intendevi. Sta lavorando adesso. Grazie per aver chiarito questo comportamento! –

+2

È davvero terribile, non è vero? Anche MS Access non sa isolare le variabili interne! – Gangnus

+0

+1 Giusto per essere chiari, questo deve essere considerato un bug con il motore di database di Access, uno con prospettive trascurabili di essere sempre corretti e con la solita scusa, cioè che un cliente può fare affidamento sul comportamento (rotto) (ed è importante per ricordare che il cliente più importante del motore di database Access è il team di Windows!) – onedaywhen

Problemi correlati