MS Access: WHERE-EXISTS-предложение не работает на представлениях? - PullRequest
8 голосов
/ 31 января 2012

Предварительные условия: В MS Access 2010 создайте следующие таблицы:

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:

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. Что здесь не так? Я что-то упустил?

1 Ответ

6 голосов
/ 31 января 2012

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

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 даже не знает, как изолировать псевдонимы!

...