SQL
पार आवेदन, बाहरी लागू होते हैं
खोज…
क्रॉस एप्लिकेशन और कंप्यूटर अनुप्रयोग मूल बातें
लागू किया जाएगा जब सही अभिव्यक्ति में तालिका मूल्यवान कार्य करते हैं।
विभागों के बारे में जानकारी रखने के लिए एक विभाग तालिका बनाएँ। फिर एक कर्मचारी तालिका बनाएं जिसमें कर्मचारियों के बारे में जानकारी हो। कृपया ध्यान दें, प्रत्येक कर्मचारी एक विभाग से संबंधित है, इसलिए कर्मचारी तालिका में विभाग तालिका के साथ संदर्भात्मक अखंडता है।
प्रथम क्वेरी विभाग तालिका से डेटा का चयन करती है और विभाग तालिका के प्रत्येक रिकॉर्ड के लिए कर्मचारी तालिका का मूल्यांकन करने के लिए CROSS APPLY का उपयोग करती है। दूसरी क्वेरी बस कर्मचारी तालिका के साथ विभाग की तालिका में मिलती है और सभी मिलान रिकॉर्ड तैयार किए जाते हैं।
SELECT *
FROM Department D
CROSS APPLY (
SELECT *
FROM Employee E
WHERE E.DepartmentID = D.DepartmentID
) A
GO
SELECT *
FROM Department D
INNER JOIN Employee E
ON D.DepartmentID = E.DepartmentID
यदि आप उनके द्वारा उत्पादित परिणामों को देखते हैं, तो यह सटीक एक ही परिणाम-सेट है; यह एक JOIN से अलग कैसे है और यह अधिक कुशल प्रश्न लिखने में कैसे मदद करता है।
स्क्रिप्ट # 2 में पहली क्वेरी विभाग तालिका से डेटा का चयन करती है और विभाग तालिका के प्रत्येक रिकॉर्ड के लिए कर्मचारी तालिका का मूल्यांकन करने के लिए OUTER APPLY का उपयोग करती है। उन पंक्तियों के लिए जिनके लिए कर्मचारी तालिका में कोई मेल नहीं है, उन पंक्तियों में NULL मान शामिल हैं जैसा कि आप पंक्ति 5 और 6 के मामले में देख सकते हैं। दूसरी क्वेरी बस विभाग तालिका और कर्मचारी तालिका के बीच एक LEFT OUTER JOIN का उपयोग करती है। जैसा कि उम्मीद थी कि विभाग की तालिका से क्वेरी सभी पंक्तियों को लौटाती है; यहां तक कि उन पंक्तियों के लिए जिनके लिए कर्मचारी तालिका में कोई मेल नहीं है।
SELECT *
FROM Department D
OUTER APPLY (
SELECT *
FROM Employee E
WHERE E.DepartmentID = D.DepartmentID
) A
GO
SELECT *
FROM Department D
LEFT OUTER JOIN Employee E
ON D.DepartmentID = E.DepartmentID
GO
भले ही उपरोक्त दोनों प्रश्न समान जानकारी लौटाते हैं, लेकिन निष्पादन योजना थोड़ी अलग होगी। लेकिन लागत के लिहाज से बहुत अंतर नहीं होगा।
अब यह देखने का समय आ गया है कि एपीपीएलवाई ऑपरेटर वास्तव में कहां आवश्यक है। स्क्रिप्ट # 3 में, मैं एक टेबल-वेल्यूड फंक्शन बना रहा हूँ, जो डिपार्टमेंटआईडी को इसके पैरामीटर के रूप में स्वीकार करता है और इस विभाग से जुड़े सभी कर्मचारियों को लौटाता है। अगली क्वेरी विभाग तालिका से डेटा का चयन करती है और हमारे द्वारा बनाए गए फ़ंक्शन के साथ जुड़ने के लिए CROSS APPLY का उपयोग करती है। यह बाहरी तालिका अभिव्यक्ति (हमारे मामले विभाग तालिका में) से प्रत्येक पंक्ति के लिए विभागीय पास करता है और प्रत्येक पंक्ति के लिए फ़ंक्शन का मूल्यांकन एक सहसंबद्ध सबक्वेरी के समान करता है। अगली क्वेरी CROSS APPLY के स्थान पर OUTER APPLY का उपयोग करती है और इसलिए CROSS APPLY के विपरीत जो केवल सहसंबद्ध डेटा लौटाती है, OUTER APPLY गैर-सहसंबद्ध डेटा भी लौटाता है, NULL को लापता कॉलम में रखता है।
CREATE FUNCTION dbo.fn_GetAllEmployeeOfADepartment (@DeptID AS int)
RETURNS TABLE
AS
RETURN
(
SELECT
*
FROM Employee E
WHERE E.DepartmentID = @DeptID
)
GO
SELECT
*
FROM Department D
CROSS APPLY dbo.fn_GetAllEmployeeOfADepartment(D.DepartmentID)
GO
SELECT
*
FROM Department D
OUTER APPLY dbo.fn_GetAllEmployeeOfADepartment(D.DepartmentID)
GO
तो अब अगर आप सोच रहे हैं, तो क्या हम उपरोक्त प्रश्नों के स्थान पर एक सरल जुड़ाव का उपयोग कर सकते हैं? तब उत्तर नहीं है, यदि आप उपरोक्त प्रश्नों में CROSS / OUTER APPLY को INNER JOIN / LEFT OUTER JOIN से प्रतिस्थापित करते हैं, तो ON clause (कुछ 1 = 1) निर्दिष्ट करें और क्वेरी चलाएँ, आपको "मल्टी-पार्ट आइडेंटिफ़ायर" मिलेगा D.DepboxID "बाध्य नहीं हो सकता है।" त्रुटि। ऐसा इसलिए है क्योंकि JOINs के साथ बाहरी क्वेरी का निष्पादन संदर्भ फ़ंक्शन (या एक व्युत्पन्न तालिका) के निष्पादन संदर्भ से अलग है, और आप पैरामीटर के रूप में बाहरी क्वेरी से फ़ंक्शन के मान / चर को बांध नहीं सकते हैं। इसलिए ऐसे प्रश्नों के लिए APPLY ऑपरेटर की आवश्यकता होती है।