यह कथन कानूनी है (दूसरे शब्दों में, FROM
आवश्यक नहीं है):
SELECT x = 1;
SELECT x = 1 WHERE 1 = 1; -- also try WHERE 1 = 0;
जब आप स्पष्ट रूप से मौजूद नहीं हो सकते हैं, तो एक कॉलम नाम पेश करते समय चाल। तो ये विफल:
SELECT name WHERE 1 = 1;
SELECT x = 1 WHERE id > 0;
Msg 207, स्तर 16, राज्य 1
अमान्य स्तंभ नाम 'नाम'।
Msg 207, स्तर 16, राज्य 1
अमान्य स्तंभ नाम 'id'।
लेकिन जब अवैध कॉलम को किसी सबक्वेरी की तरह पेश किया जाता है, तो SQL सर्वर तब क्या करता है जब वह उस कॉलम को सबक्वेरी के आंतरिक दायरे में नहीं पाता है, बाहरी दायरे में ट्रावर्स हो जाता है, और सबक्वेरी को उस बाहरी दायरे से संबंधित बना देता है। यह सभी पंक्तियों को लौटाएगा, उदाहरण के लिए:
SELECT * FROM sys.columns WHERE name IN (SELECT name WHERE 1 = 1);
क्योंकि यह अनिवार्य रूप से कह रहा है:
SELECT * FROM sys.columns WHERE name IN (SELECT sys.columns.name WHERE 1 = 1); /*
^^^^^^^^^^^ -----------
| |
----------------------------------- */
आपको WHERE
उपनगर में एक खंड की भी आवश्यकता नहीं है :
SELECT * FROM sys.columns WHERE name IN (SELECT name);
आप देख सकते हैं कि यह वास्तव में बाहरी स्कॉप्ड टेबल को देख रहा है, क्योंकि यह:
SELECT * FROM sys.columns WHERE name IN (SELECT name WHERE name > N'x');
बहुत कम पंक्तियों को लौटाता है (मेरे सिस्टम पर 11)।
इसमें स्कूपिंग के बारे में मानक का पालन शामिल है। जब आप दो # टेबल टेबल रखते हैं तो आप ऐसी ही चीजें देख सकते हैं:
CREATE TABLE #foo(foo int);
CREATE TABLE #bar(bar int);
SELECT foo FROM #foo WHERE foo IN (SELECT foo FROM #bar);
जाहिर है, यह त्रुटि होनी चाहिए, ठीक है, क्योंकि इसमें कोई भी नहीं foo
है #bar
? नहीं। क्या होता है कि SQL सर्वर कहता है, "ओह, मुझे foo
यहां नहीं मिला , आपको दूसरे का मतलब होना चाहिए।"
इसके अलावा, सामान्य तौर पर, मैं इससे बचूंगा NOT IN
। NOT EXISTS
कुछ परिदृश्यों में अधिक कुशल होने की क्षमता है, लेकिन इससे भी महत्वपूर्ण बात यह है कि इसका व्यवहार तब नहीं बदलता है जब यह संभव होता है कि लक्ष्य स्तंभ हो सकता है NULL
। अधिक जानकारी के लिए इस पोस्ट को देखें ।