2012-01-31 12 views
8

Önkoşullar: MS Access 2010'da aşağıdaki tablo oluşturmak:MS Access: WHERE-EXISTS cümlesi görünümler üzerinde çalışmıyor mu?

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

Ayrıca bu sorgu kullanan bir görünüm olarak adlandırılır BVIEW oluşturun:

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

Şimdi BVIEW BTBL ile aynı içeriğe sahip olmalıdır. Yine aşağıdaki iki sorgular farklı sonuçlar verir:

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) 

ilk sorgu iki kayıtları (1 ve 2), ancak ikinci sorgu ATBL tüm kayıtları verir döndürür. Burada neyin var? Bir şey mi eksik?

+0

FWIW kodunuz SQL Server'da beklendiği gibi çalışır. – onedaywhen

cevap

6

Bir görünüm gerçekten kaydedilmiş bir SQL SELECT ifadesidir. En azından MS Access'te kaydedilmiş olan budur. Ve A ve B aynı iç değişkenleri kullanıyorsunuz. IMHO, karışıyorlar.

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

Yani, son satırı Yani

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) 

olarak bakacağız gördüğümüz gibi,:

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) 

deneyin örneğin, bazı iç isimlerini değiştirmek üzere son satırı gerçekten görünüyor Burada MS Access, takma adların nasıl yalıtılacağını bile bilmiyor!

+0

Tamam, ilk kez yanlış anladım, şimdi SQL'ini görüyorum, ne demek istediğini anlıyorum. Şuan çalışıyor. Bu davranışı açıkladığınız için teşekkürler! –

+2

Gerçekten korkunç, değil mi? MS Access bile iç değişkenleri izole etmeyi bilmez! – Gangnus

+0

+1 Sadece açık olmak gerekirse, bu Access veritabanı altyapısı ile bir hata olarak kabul edilmelidir, biri ihmal edilebilir umutları olan ve her zamanki bahaneyle, yani bir müşterinin (kırık) davranışına güvenebileceği bir durumdur (ve önemlidir). Access veritabanı motorunun en önemli müşterisinin Windows ekibi olduğunu hatırlamak için!) – onedaywhen