2012-01-31 3 views
8

Предпосылки: В MS Access 2010 создать следующие таблицы:MS Access: WHERE-EXISTS-статья не работает над представлениями?

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

создать также мнение под названием BVIEW, который использует следующий ЗЕЬЕСТ:

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

Теперь BVIEW должны иметь такое же содержание, как BTBL. Тем не менее следующие два запроса будет возвращать разные результаты:

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) 

Первый запрос возвращает две записи (1 и 2), а второй запрос возвращает все записи из ATBL. Что здесь не так? Я что-то упускаю?

+0

FWIW Ваш код работает как ожидается на SQL Server. – onedaywhen

ответ

6

Вид действительно сохраненный оператор SQL SELECT. По крайней мере, это то, что сохраненный вид в MS Access. И вы используете те же внутренние переменные A и B. IMHO, они смешиваются. Последняя строка действительно выглядит

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) 

Попробуйте изменить некоторые внутренние имена, например:

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

Итак, последняя строка будет выглядеть

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) 

Итак, как мы видим здесь MS Access даже не знает, как изолировать псевдонимы!

+0

Хорошо, я сначала ошибался, теперь, когда я вижу ваш SQL, я понимаю, что вы имели в виду. Теперь работает. Спасибо за разъяснение этого поведения! –

+2

Это действительно страшно, не так ли? MS Access даже не знает, чтобы изолировать внутренние переменные! – Gangnus

+0

+1 Для того чтобы быть ясным, это должно считаться ошибкой с механизмом базы данных Access, с незначительными перспективами когда-либо фиксированного и обычным оправданием, то есть, что клиент может полагаться на (нарушенное) поведение (и это важно помните, что самым важным клиентом механизма базы данных Access является команда Windows!) – onedaywhen

Смежные вопросы