यदि स्तंभ table_b
नहीं है, तो क्वेरी वाक्यात्मक रूप से सही SQL है name
। कारण गुंजाइश संकल्प है।
जब क्वेरी पार्स की जाती है, तो पहले यह चेक किया जाता है कि क्या table_b
एक name
कॉलम है। चूंकि यह नहीं है, तो table_a
जाँच की जाती है। यह केवल एक त्रुटि फेंकेगा यदि तालिकाओं में से कोई एक name
स्तंभ न हो।
अंत में क्वेरी को इस प्रकार निष्पादित किया जाता है:
select a.*
from table_a a
where a.name in (select a.name
from table_b b
);
परिणामों के अनुसार क्वेरी प्रत्येक पंक्ति के लिए table_a
, सबक्वेरी (select name from table_b)
- या (select a.name from table_b b)
- एक तालिका होगी जिसमें एक ही a.name
मान वाला एक स्तंभ होगा और जितनी पंक्तियाँ होंगी table_b
। इसलिए, यदि table_b
1 या अधिक पंक्तियाँ हैं, तो क्वेरी निम्नानुसार चलती है:
select a.*
from table_a a
where a.name in (a.name, a.name, ..., a.name) ;
या:
select a.*
from table_a a
where a.name = a.name ;
या:
select a.*
from table_a a
where a.name is not null ;
यदि table_b
खाली है, तो क्वेरी कोई पंक्तियाँ नहीं लौटाएगी (उस संभावना की ओर संकेत करने के लिए @ thhaix)।
वह (यह तथ्य कि आपको कोई त्रुटि नहीं मिलती है) संभवतः सबसे अच्छा कारण है कि सभी स्तंभ संदर्भों को तालिका नाम / उपनाम के साथ उपसर्ग किया जाना चाहिए। यदि प्रश्न था:
select a.* from table_a where a.name in (select b.name from table_b);
आपको सीधे त्रुटि मिली होगी। जब तालिका उपसर्गों को छोड़ दिया जाता है, तो ऐसी गलतियों के लिए मुश्किल नहीं है, विशेष रूप से अधिक जटिल प्रश्नों में, और इससे भी अधिक महत्वपूर्ण है, किसी का ध्यान नहीं जाना।
Oracle डॉक्स में भी पढ़ें : Static SQL स्टेटमेंट में नामों का रिज़ॉल्यूशन इनर कैप्चर में समान उदाहरण B-6 और SELECT और DML स्टेटमेंट पैराग्राफ में इनर कैप्चर इनर कैप्चरिंग में अनुशंसाएँ :
उपयुक्त तालिका उपनाम के साथ बयान में प्रत्येक कॉलम संदर्भ को योग्य बनाएं।