8

前提条件: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);

また、次のSELECTステートメントを使用するBVIEWというビューを作成します。

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

これで、BVIEWの内容はBTBLと同じになります。それでも、次の2つのクエリは異なる結果を返します。

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)

最初のクエリは2つのレコード(1と2)を返しますが、2番目のクエリはATBLからすべてのレコードを返します。ここで何が問題になっていますか?私は何かが足りないのですか?

4

1 に答える 1

6

ビューは実際には保存されたSQLSELECTステートメントです。少なくとも、これはMSAccessに保存されたビューです。そして、あなたは同じ内部変数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)

したがって、ここに表示されているように、MSAccessはエイリアスを分離する方法さえ知りません。

于 2012-01-31T13:17:15.887 に答える