दोनों कथनों के शब्दार्थ अलग-अलग हैं:
- यदि कोई पंक्ति नहीं मिली है, तो पहला चर का मान निर्धारित नहीं करता है।
- यदि कोई पंक्ति नहीं मिली है, तो दूसरा हमेशा चर सेट करता है, जिसमें अशक्त भी शामिल है।
लगातार स्कैन एक खाली पंक्ति (बिना किसी कॉलम के साथ!) पैदा करता है, जिसके परिणामस्वरूप आधार तालिका से मिलान नहीं होने की स्थिति में चर को अपडेट किया जाएगा। लेफ्ट जॉइन सुनिश्चित करता है कि खाली पंक्ति ज्वाइन करने से बचे। परिवर्तनीय असाइनमेंट को निष्पादन योजना के रूट नोड पर होने के बारे में सोचा जा सकता है।
का उपयोग करते हुए SELECT @result
-- Set initial value
DECLARE @result uniqueidentifier = {guid 'FE2CA909-1162-4C6C-A7AC-33B257E28539'};
-- @result does not change
SELECT @result = AccountId
FROM Accounts
WHERE AccountId={guid '7AD4D33C-1ED7-4183-B7F3-48C33D666525'};
SELECT @result;
का उपयोग करते हुए SET @result
-- Set initial value
DECLARE @result uniqueidentifier = {guid 'FE2CA909-1162-4C6C-A7AC-33B257E28539'};
-- @result set to null
SET @result =
(
SELECT AccountId
FROM Accounts
WHERE AccountId={guid '7AD4D33C-1ED7-4183-B7F3-48C33D666525'}
);
SELECT @result;
निष्पादन की योजना
रूट नोड पर कोई पंक्ति नहीं आती है, इसलिए कोई असाइनमेंट नहीं होता है।
एक पंक्ति हमेशा रूट नोड पर आती है, इसलिए चर असाइनमेंट होता है।
अतिरिक्त लगातार स्कैन और नेस्टेड लूप्स लेफ्ट आउटर जॉइन के बारे में चिंतित होने के लिए कुछ भी नहीं है। विशेष रूप से शामिल होना सस्ता है क्योंकि इसकी बाहरी इनपुट पर एक पंक्ति का सामना करने की गारंटी है, और आंतरिक इनपुट पर अधिकतम एक पंक्ति (आपके उदाहरण में)।
वैरिएबल असाइनमेंट होने के लिए सब-वे से पंक्ति बनाने के लिए अन्य तरीके हैं। एक निरर्थक अदिश समुच्चय का उपयोग करना है (समूह द्वारा कोई समूह नहीं):
-- Set initial value
DECLARE @result uniqueidentifier = {guid 'FE2CA909-1162-4C6C-A7AC-33B257E28539'};
-- @result set to null
SET @result =
(
SELECT MAX(AccountId)
FROM Accounts
WHERE AccountId={guid '7AD4D33C-1ED7-4183-B7F3-48C33D666525'}
);
SELECT @result;
ध्यान दें कि स्केलर एग्रीगेट एक पंक्ति उत्पन्न करता है, भले ही उसे कोई इनपुट न मिले।
प्रलेखन:
यदि सेलेक्ट स्टेटमेंट में कोई पंक्तियाँ नहीं होती हैं, तो वेरिएबल अपने वर्तमान मूल्य को बनाए रखता है। यदि अभिव्यक्ति एक स्केलर सबक्वेरी है जिसका कोई मूल्य नहीं है, तो चर को NULL पर सेट किया जाता है।
चरों को निर्दिष्ट करने के लिए, हम अनुशंसा करते हैं कि आप SELECT @local_variable के बजाय SET @local_variable का उपयोग करें।
आगे की पढाई: