2012-01-31 11 views
8

आवश्यक: एमएस एक्सेस 2010 में निम्न तालिकाओं बनाएँ:एमएस एक्सेस: कहां-EXISTS-Clause विचारों पर काम नहीं कर रहा है?

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 से सभी रिकॉर्ड रिटर्न देता है। यहाँ क्या गलत है? क्या मैं कुछ भूल रहा हूँ?

+0

FWIW आपका कोड SQL सर्वर पर अपेक्षित के रूप में कार्य करता है। – onedaywhen

उत्तर

6

एक दृश्य वास्तव में एक सहेजा गया SQL चयन कथन है। कम से कम, एमएस एक्सेस में एक सहेजा गया दृश्य यह है। और आप एक ही आंतरिक चर ए और बी 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) 

तो दिखाई देगा, जैसा कि हम देखेंगे यहां, एमएस एक्सेस को यह भी नहीं पता कि एलियास को अलग कैसे किया जाए!

+0

ठीक है, मैंने आपको पहली बार गलत पाया है, अब जब मैं आपका एसक्यूएल देखता हूं तो मैं समझता हूं कि आपका क्या मतलब है। अब यह काम कर रहा है। इस व्यवहार को स्पष्ट करने के लिए धन्यवाद! –

+2

यह वास्तव में भयानक है, है ना? एमएस एक्सेस भी आंतरिक चर अलग करने के लिए नहीं जानता है! – Gangnus

+0

+1 बस स्पष्ट होने के लिए, इसे एक्सेस डेटाबेस इंजन के साथ एक बग माना जाना चाहिए, एक को तय किए जाने की नगण्य संभावनाओं के साथ और सामान्य बहाना के लिए यानी कि ग्राहक (टूटा हुआ) व्यवहार (और यह महत्वपूर्ण है) पर भरोसा कर सकता है याद रखने के लिए कि एक्सेस डेटाबेस इंजन का सबसे महत्वपूर्ण ग्राहक विंडोज टीम है!) – onedaywhen

संबंधित मुद्दे