2012-01-31 12 views
8

前提条件:MS Accessで2010以下の表を作成します。今BVIEWがBTBLと同じ内容を持つべきMS Access:WHERE-EXISTS節はビューでは機能しませんか?

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

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というビューを作成します。それにもかかわらず、次の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) 

最初のクエリは、二つのレコード(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 AA.ID FROM ATBL AS AA WHERE AA.ID = 1 OR AA.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 A.ID FROM ATBL AS A WHERE A.ID = 1 OR A.ID = 2) AS B WHERE B.ID=A.ID) 

ように見えますここでは、MS Accessはエイリアスを分離する方法も知らない!

+0

最初に間違ってしまったので、SQLの内容を理解しています。それは今働いている。この動作を明確にしてくれてありがとう! –

+2

本当にひどいですね。 MS Accessは、内部変数を分離することさえ知りません! – Gangnus

+0

+1これは、Accessデータベースエンジンのバグとみなされる必要があります.1つは、常に固定されている可能性がほとんどなく、通常の言い訳では、(壊れた)動作に依存する可能性がありますAccessデータベースエンジンの最も重要な顧客がWindowsチームであることを覚えておいてください) – onedaywhen

関連する問題