2012-01-31 14 views
8

Requisitos: En MS Access 2010 crear las siguientes tablas:MS Access: ¿cláusula WHERE-EXISTS-no funciona en las vistas?

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); 

también se crea una vista denominada bVIEW que utiliza la siguiente instrucción SELECT:

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

Ahora bVIEW deberían tener el mismo contenido que BTBL. Sin embargo las dos consultas siguientes volverán resultados diferentes:

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 primera consulta devuelve dos registros (1 y 2), pero la segunda consulta devuelve todos los registros de ATBL. ¿Qué pasa aquí? ¿Me estoy perdiendo de algo?

+0

FWIW su código funciona como se esperaba en SQL Server. – onedaywhen

Respuesta

6

Una vista es realmente una declaración SQL SELECT guardada. Al menos, esto es lo que es una vista guardada en MS Access. Y usas las mismas variables internas A y B. En mi humilde opinión, se mezclan. La última línea se ve realmente como

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) 

tratar de cambiar algunos nombres internos, por ejemplo:

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

Por lo tanto, la última línea se verá como

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) 

Así, como vemos aquí, ¡MS Access incluso no sabe cómo aislar alias!

+0

Ok, te entendí mal la primera vez, ahora que veo tu SQL entiendo lo que querías decir. Está funcionando ahora. Gracias por aclarar este comportamiento! –

+2

Es realmente terrible, ¿verdad? ¡MS Access incluso no sabe aislar las variables internas! – Gangnus

+0

+1 Para que quede claro, esto debe considerarse un error con el motor de la base de datos de Access, uno con perspectivas insignificantes de que alguna vez se haya solucionado y la excusa habitual, es decir, que un cliente puede confiar en el comportamiento (defectuoso) (y es importante ¡para recordar que el cliente más importante del motor de base de datos de Access es el equipo de Windows!) – onedaywhen