এই বিবৃতি আইনী (অন্য কথায়, কোনও 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
অবৈধ কলামের নাম 'আইডি'।
কিন্তু যখন অবৈধ কলামটি সাবকিউরির মতো কিছুতে প্রবর্তিত হয়, এসকিউএল সার্ভার যখন সাবকোরির অভ্যন্তরীণ ক্ষেত্রের মধ্যে এই কলামটি খুঁজে না পায় তখন কী করে, বাইরের স্কোপের সাথে সংযুক্ত থাকে এবং উপকণাকে সেই বাহ্যিক ক্ষেত্রের সাথে সম্পর্কিত করে তোলে। এটি সমস্ত সারি ফিরিয়ে দেবে, উদাহরণস্বরূপ:
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
? নাঃ। যা হয় তা এসকিউএল সার্ভার বলে, "ওহ, আমি foo
এখানে একটি খুঁজে পাইনি , আপনি অবশ্যই অন্যটিকে বোঝাতে চেয়েছিলেন।"
এছাড়াও, সাধারণভাবে, আমি এড়ানো হবে NOT IN
। NOT EXISTS
কিছু পরিস্থিতিতে আরও দক্ষ হওয়ার সম্ভাবনা রয়েছে, তবে আরও বড় কথা, টার্গেট কলামটি হওয়ার সম্ভাবনা থাকলে এর আচরণ পরিবর্তন হয় না NULL
। আরও তথ্যের জন্য এই পোস্টটি দেখুন ।