Database
 sql >> डेटाबेस >  >> RDS >> Database

SQL जॉइन के लिए आपका अंतिम गाइड:INNER JOIN - भाग 1

इनर जॉइन, आउटर जॉइन, क्रॉस जॉइन? क्या देता है?

यह एक वाजिब सवाल है। मैंने एक बार विजुअल बेसिक कोड देखा जिसमें टी-एसक्यूएल कोड एम्बेडेड थे। वीबी कोड एकाधिक चयन कथनों के साथ तालिका रिकॉर्ड पुनर्प्राप्त करता है, प्रति तालिका एक चयन *। फिर, यह कई परिणाम सेट को एक रिकॉर्ड सेट में जोड़ता है। बेतुका?

ऐसा करने वाले युवा डेवलपर्स के लिए, यह नहीं था। लेकिन जब उन्होंने मुझसे यह मूल्यांकन करने के लिए कहा कि सिस्टम धीमा क्यों है, तो उस मुद्दे ने सबसे पहले मेरा ध्यान खींचा। ये सही है। उन्होंने SQL जॉइन के बारे में कभी नहीं सुना। उनके प्रति निष्पक्षता में, वे ईमानदार और सुझावों के लिए खुले थे।

आप एसक्यूएल जॉइन का वर्णन कैसे करते हैं? शायद, आपको एक गाना याद हो - कल्पना करें जॉन लेनन द्वारा:

आप कह सकते हैं कि मैं एक सपने देखने वाला हूं, लेकिन मैं अकेला नहीं हूं।

मुझे आशा है कि किसी दिन आप हमारे साथ जुड़ेंगे, और दुनिया एक हो जाएगी।

गीत के संदर्भ में, जुड़ना एकता है। SQL डेटाबेस में, 2 या अधिक तालिकाओं के रिकॉर्ड को एक परिणाम सेट में संयोजित करने से एक जुड़ाव बनता है

यह लेख SQL जॉइन के बारे में बात करने वाली 3-भाग श्रृंखला की शुरुआत है:

  • इनर जॉइन
  • बाहरी जॉइन, जिसमें बाएँ, दाएँ और पूर्ण शामिल हैं
  • क्रॉस जॉइन

लेकिन इससे पहले कि हम इनर जॉइन पर चर्चा शुरू करें, आइए सामान्य रूप से जॉइन का वर्णन करें।

एसक्यूएल जॉइन के बारे में अधिक जानकारी

FROM क्लॉज के ठीक बाद जॉइन दिखाई देते हैं। अपने सरलतम रूप में, यह SQL-92 मानक का उपयोग करने जैसा दिखता है:

FROM <table source> [<alias1>]
<join type> JOIN <table source> [<alias2>] [ON <join condition>] 
[<join type> JOIN <table source> [<alias3>] [ON <join condition>]
<join type> JOIN <table source> [<aliasN>] [ON <join condition>]]
[WHERE <condition>]

आइए जॉइन के आसपास की रोजमर्रा की चीजों का वर्णन करें।

तालिका स्रोत

Microsoft के अनुसार, आप 256 टेबल स्रोत तक जोड़ सकते हैं। बेशक, यह आपके सर्वर संसाधनों पर निर्भर करता है। मैंने अपने जीवन में कभी भी 10 से अधिक तालिकाओं में शामिल नहीं किया है, 256 का उल्लेख नहीं करने के लिए। वैसे भी, तालिका स्रोत निम्न में से कोई भी हो सकते हैं:

  • तालिका
  • देखें
  • तालिका या समानार्थी देखें
  • तालिका चर
  • तालिका-मूल्यवान फ़ंक्शन
  • व्युत्पन्न तालिका

तालिका उपनाम

एक उपनाम वैकल्पिक है, लेकिन यह आपके कोड को छोटा करता है और टाइपिंग को कम करता है। यह आपको त्रुटियों से बचने में भी मदद करता है जब एक कॉलम नाम दो या दो से अधिक तालिकाओं में मौजूद होता है जो एक सेलेक्ट, अपडेट, इंसर्ट, या डिलीट में उपयोग किया जाता है। यह आपके कोड में स्पष्टता भी जोड़ता है। यह वैकल्पिक है, लेकिन मैं उपनामों का उपयोग करने की अनुशंसा करता हूं। (जब तक आप टेबल स्रोतों को नाम से टाइप करना पसंद नहीं करते।)

शामिल होने की शर्त

ON कीवर्ड जॉइन कंडीशन से पहले होता है जो जॉइन की गई 2 टेबल्स से सिंगल जॉइन या 2-की कॉलम हो सकता है। या यह 2 से अधिक प्रमुख स्तंभों का उपयोग करके एक समग्र जुड़ाव हो सकता है। यह परिभाषित करता है कि टेबल कैसे संबंधित हैं।

हालाँकि, हम केवल INNER और OUTER जॉइन के लिए शामिल होने की स्थिति का उपयोग करते हैं। क्रॉस जॉइन पर इसका उपयोग करने से एक त्रुटि उत्पन्न होगी।

चूंकि जुड़ने की शर्तें रिश्तों को परिभाषित करती हैं, इसलिए उन्हें ऑपरेटरों की आवश्यकता होती है।

जॉइन कंडीशन ऑपरेटरों में सबसे आम समानता (=) ऑपरेटर है। अन्य ऑपरेटर जैसे> या <भी काम करते हैं, लेकिन वे दुर्लभ हैं।

एसक्यूएल जॉइन बनाम सबक्वेरी

अधिकांश जॉइन को सबक्वायरी और इसके विपरीत के रूप में फिर से लिखा जा सकता है। शामिल होने की तुलना में उपश्रेणियों के बारे में अधिक जानने के लिए इस लेख को देखें।

जॉइन और व्युत्पन्न टेबल

शामिल होने में व्युत्पन्न तालिकाओं का उपयोग करना इस तरह दिखता है:

FROM table1 a
INNER JOIN (SELECT y.column3 from table2 x
            INNER JOIN table3 y on x.column1 = y.column1) b ON a.col1 = b.col2

यह किसी अन्य SELECT कथन के परिणाम से शामिल हो रहा है, और यह पूरी तरह से मान्य है।

आपके पास और उदाहरण होंगे, लेकिन आइए SQL JOINS के बारे में एक आखिरी बात देखें। इस प्रकार SQL सर्वर की क्वेरी ऑप्टिमाइज़र प्रक्रियाएँ जुड़ती हैं।

SQL सर्वर प्रोसेस कैसे जुड़ता है

यह समझने के लिए कि प्रक्रिया कैसे काम करती है, आपको इसमें शामिल दो प्रकार के संचालन के बारे में जानना होगा:

  • तार्किक संचालन क्वेरी में उपयोग किए गए जॉइन प्रकारों के अनुरूप:INNER, OUTER, या CROSS। आप, डेवलपर के रूप में, क्वेरी बनाते समय प्रसंस्करण के इस भाग को परिभाषित करते हैं।
  • शारीरिक संचालन - क्वेरी ऑप्टिमाइज़र आपके शामिल होने के लिए लागू होने वाले सर्वोत्तम भौतिक संचालन को चुनता है। सर्वोत्तम का अर्थ है परिणाम उत्पन्न करने के लिए सबसे तेज़। आपकी क्वेरी का एक्ज़ीक्यूशन प्लान चुने गए फिजिकल जॉइन ऑपरेटर्स को दिखाएगा। ये ऑपरेशन हैं:
    • नेस्टेड लूप शामिल हों। यदि दो तालिकाओं में से एक छोटी है और दूसरी बड़ी और अनुक्रमित है तो यह ऑपरेशन तेज़ है। इसके लिए कम से कम तुलना के साथ कम से कम I/O की आवश्यकता होती है, लेकिन यह बड़े परिणाम सेट के लिए अच्छा नहीं है।
    • शामिल हों। जॉइन में उपयोग किए गए कॉलम द्वारा बड़े और सॉर्ट किए गए परिणाम सेट के लिए यह सबसे तेज़ ऑपरेशन है।
    • हैश जॉइन करें। क्वेरी ऑप्टिमाइज़र इसका उपयोग तब करता है जब नेस्टेड लूप के लिए परिणाम सेट बहुत बड़ा होता है, और मर्ज जॉइन के लिए इनपुट अनसोल्ड होते हैं। एक हैश पहले उसे सॉर्ट करने और मर्ज जॉइन लागू करने से अधिक कुशल है।
    • अनुकूली जुड़ाव। SQL सर्वर 2017 से शुरू होकर, यह नेस्टेड लूप या हैश के बीच चुनाव को सक्षम बनाता है . शामिल होने की विधि को तब तक के लिए टाल दिया जाता है जब तक कि पहला इनपुट स्कैन नहीं हो जाता। यह ऑपरेशन गतिशील रूप से पुन:संकलित किए बिना बेहतर भौतिक जुड़ाव में बदल जाता है।

हमें इससे परेशान होने की आवश्यकता क्यों है?

एक शब्द:प्रदर्शन।

एक बात यह जानना है कि सही परिणाम देने के लिए जॉइन के साथ प्रश्न कैसे बनाएं। एक और यह है कि इसे जितनी जल्दी हो सके चलाना है। यदि आप अपने उपयोगकर्ताओं के साथ अच्छी प्रतिष्ठा चाहते हैं तो आपको इसके बारे में अतिरिक्त चिंतित होना होगा।

तो, इन तार्किक संचालनों के लिए आपको निष्पादन योजना में क्या देखने की आवश्यकता है?

  • मान लें कि मर्ज जॉइन से पहले एक सॉर्ट ऑपरेटर आता है . यह सॉर्ट ऑपरेशन बड़ी तालिकाओं के लिए महंगा है (चित्र 2)। आप जॉइन में इनपुट टेबल को प्री-सॉर्ट करके इसे ठीक कर सकते हैं।
  • मान लीजिए कि मर्ज जॉइन की इनपुट टेबल में डुप्लीकेट हैं . SQL सर्वर दूसरी तालिका के डुप्लिकेट को tempdb में वर्कटेबल में लिख देगा। फिर, यह वहां तुलना करेगा। सांख्यिकी IO इसमें शामिल किसी भी कार्य तालिका को प्रकट करेगा।
  • जब हैश जो में विशाल डेटा tempdb में फैल जाता है में, सांख्यिकी IO WorkFiles या WorkTables पर एक बड़े तार्किक पठन को प्रकट करेगा। निष्पादन योजना (चित्र 3) में एक चेतावनी भी दिखाई देगी। आप दो चीजें लागू कर सकते हैं:यदि संभव हो तो इनपुट टेबल को प्री-सॉर्ट करें या जॉइन को कम करें। परिणामस्वरूप, क्वेरी ऑप्टिमाइज़र एक और भौतिक जुड़ाव चुन सकता है।

संकेत में शामिल हों

SQL सर्वर 2019 में शामिल होने के संकेत नए हैं। जब आप इसे अपने जॉइन में उपयोग करते हैं, तो यह क्वेरी ऑप्टिमाइज़र को यह तय करने से रोकता है कि क्वेरी के लिए सबसे अच्छा क्या है। जब भौतिक उपयोग में शामिल होने की बात आती है तो आप मालिक होते हैं।

अब रुक जाओ, वहीं। सच्चाई यह है कि, क्वेरी ऑप्टिमाइज़र आमतौर पर आपकी क्वेरी के लिए सर्वश्रेष्ठ भौतिक जुड़ाव का चयन करता है। यदि आप नहीं जानते कि आप क्या कर रहे हैं, तो जुड़ने के संकेतों का उपयोग न करें।

संभावित संकेत जो आप निर्दिष्ट कर सकते हैं वे हैं LOOP, MERGE, HASH, या REMOTE।

मैंने जुड़ने के संकेतों का उपयोग नहीं किया है, लेकिन यहाँ सिंटैक्स है:


<join type> <join hint> JOIN <table source> [<alias>] ON <join condition>

इनर जॉइन के बारे में सब कुछ

INNER JOIN एक शर्त के आधार पर दोनों तालिकाओं में मिलान रिकॉर्ड वाली पंक्तियों को लौटाता है। यदि आप कीवर्ड INNER निर्दिष्ट नहीं करते हैं तो यह डिफ़ॉल्ट जुड़ाव भी है:

जैसा कि आप देख रहे हैं, तालिका1 . की पंक्तियों का मिलान और तालिका2 Key1 . का उपयोग करके लौटाए जाते हैं शामिल होने की स्थिति के रूप में। तालिका1 रिकॉर्ड Key1 . है ='सी' को बाहर रखा गया है क्योंकि तालिका2 . में कोई मेल खाने वाला रिकॉर्ड नहीं है ।

जब भी मैं कोई प्रश्न बनाता हूं, तो मेरी पहली पसंद INNER JOIN होती है। OUTER JOIN तब आता है जब जरूरतें ही इसे तय करती हैं।

इनर जॉइन सिंटेक्स

T-SQL में दो INNER JOIN सिंटैक्स समर्थित हैं:SQL-92 और SQL-89।

SQL-92 इनर जॉइन

FROM <table source1> [<alias1>]
INNER JOIN <table source2> [<alias2>] ON <join condition1>
[INNER JOIN <table source3> [<alias3>] ON <join condition2>
 INNER JOIN <table sourceN> [<aliasN>] ON <join conditionN>]
[WHERE <condition>]

SQL-89 इनर जॉइन

FROM <table source1> [alias1], <table source2> [alias2] [, <table source3> [alias3], <table sourceN> [aliasN]]
WHERE (<join condition1>)
[AND (<join condition2>)
AND (<join condition3>)
AND (<join conditionN>)]

कौन सा इनर जॉइन सिंटेक्स बेहतर है?

मैंने जो पहला ज्वाइन सिंटैक्स सीखा वह SQL-89 था। जब SQL-92 आखिरकार आ गया, तो मुझे लगा कि यह बहुत लंबा है। मैंने भी सोचा क्योंकि आउटपुट समान था, अधिक कीवर्ड टाइप करने की जहमत क्यों उठाई? एक ग्राफिकल क्वेरी डिज़ाइनर के पास उत्पन्न कोड SQL-92 था, और मैंने इसे वापस SQL-89 में बदल दिया। लेकिन आज, मैं एसक्यूएल-92 पसंद करता हूं, भले ही मुझे और टाइप करना पड़े। ऐसा क्यों है:

  • जुड़ने के प्रकार का इरादा स्पष्ट है। अगला लड़का या लड़की जो मेरे कोड को बनाए रखेगा, वह जान जाएगा कि क्वेरी में क्या इरादा है।
  • SQL-92 सिंटैक्स में शामिल होने की स्थिति को भूलने से एक त्रुटि उत्पन्न होगी। इस बीच, SQL-89 में शामिल होने की स्थिति को भूल जाने को क्रॉस जॉइन के रूप में माना जाएगा। अगर मेरा मतलब INNER या OUTER जॉइन से है, तो यह तब तक ध्यान देने योग्य लॉजिक बग नहीं होगा जब तक कि उपयोगकर्ता शिकायत न करें।
  • नए टूल का झुकाव SQL-92 की ओर अधिक है। अगर मैं कभी भी ग्राफिकल क्वेरी डिज़ाइनर का फिर से उपयोग करता हूं, तो मुझे इसे SQL-89 में बदलने की आवश्यकता नहीं है। मैं अब ज़िद्दी नहीं हूँ, इसलिए मेरी हृदय गति वापस सामान्य हो गई है। मुझे शुभकामनाएं।

उपरोक्त कारण मेरे हैं। आपके पास अपने कारण हो सकते हैं कि आप SQL-92 को क्यों पसंद करते हैं या आप इससे नफरत क्यों करते हैं। मुझे आश्चर्य है कि वे कारण क्या हैं। मुझे नीचे टिप्पणी अनुभाग में बताएं।

लेकिन हम उदाहरण और स्पष्टीकरण के बिना इस लेख को समाप्त नहीं कर सकते।

10 इनर जॉइन उदाहरण

<एच3>1. 2 टेबल्स में शामिल होना

SQL-92 सिंटैक्स में INNER JOIN का उपयोग करके एक साथ जुड़ने वाली 2 तालिकाओं का एक उदाहरण यहां दिया गया है।

-- Display Vests, Helmets, and Light products

USE AdventureWorks
GO

SELECT
 p.ProductID
,P.Name AS [Product]
,ps.ProductSubcategoryID
,ps.Name AS [ProductSubCategory]
FROM Production.Product p
INNER JOIN Production.ProductSubcategory ps ON P.ProductSubcategoryID = ps.ProductSubcategoryID
WHERE P.ProductSubcategoryID IN (25, 31, 33);  -- for vest, helmet, and light 
                                            -- product subcategories

आप केवल वे कॉलम निर्दिष्ट करते हैं जिनकी आपको आवश्यकता है। उपरोक्त उदाहरण में, 4 कॉलम निर्दिष्ट हैं। मुझे पता है कि यह SELECT * से बहुत लंबा है, लेकिन इसे ध्यान में रखें:यह सबसे अच्छा अभ्यास है।

तालिका उपनामों के उपयोग पर भी ध्यान दें। दोनों उत्पाद और उत्पाद उपश्रेणी टेबल में [नाम . नाम का एक कॉलम होता है ]. यदि आप उपनाम निर्दिष्ट नहीं करते हैं, तो एक त्रुटि ट्रिगर हो जाएगी।

इस बीच, यहाँ समतुल्य SQL-89 सिंटैक्स है:

-- Display Vests, Helmets, and Light products

USE AdventureWorks
GO

SELECT
 p.ProductID
,P.Name AS [Product]
,ps.ProductSubcategoryID
,ps.Name AS [ProductSubCategory]
FROM Production.Product p, Production.ProductSubcategory ps 
WHERE P.ProductSubcategoryID = ps.ProductSubcategoryID
AND P.ProductSubcategoryID IN (25, 31, 33);

WHERE क्लॉज में AND कीवर्ड के साथ मिश्रित जॉइन कंडीशन को छोड़कर वे समान हैं। लेकिन हुड के तहत, क्या वे वास्तव में वही हैं? आइए परिणाम सेट, सांख्यिकी IO और निष्पादन योजना का निरीक्षण करें।

9 रिकॉर्ड का परिणाम सेट देखें:

यह केवल परिणाम नहीं है, बल्कि SQL सर्वर के लिए आवश्यक संसाधन भी समान हैं।

तार्किक पठन देखें:

अंत में, निष्पादन योजना दोनों प्रश्नों के लिए समान क्वेरी योजना का खुलासा करती है जब उनके QueryPlanHashes बराबर हैं। आरेख में हाइलाइट किए गए कार्यों पर भी ध्यान दें:

निष्कर्षों के आधार पर, SQL सर्वर क्वेरी प्रोसेसिंग समान है, चाहे वह SQL-92 हो या SQL-89। लेकिन जैसा कि मैंने कहा, SQL-92 में स्पष्टता मेरे लिए काफी बेहतर है।

चित्र 7 योजना में प्रयुक्त नेस्टेड लूप जॉइन को भी दर्शाता है। क्यों? परिणाम सेट छोटा है।

<एच3>2. एकाधिक तालिकाओं में शामिल होना

3 सम्मिलित तालिकाओं का उपयोग करके नीचे दी गई क्वेरी देखें।

-- Get the total number of orders per Product Category
USE AdventureWorks
GO

SELECT
 ps.Name AS ProductSubcategory
,SUM(sod.OrderQty) AS TotalOrders
FROM Production.Product p
INNER JOIN Sales.SalesOrderDetail sod ON P.ProductID = sod.ProductID
INNER JOIN Sales.SalesOrderHeader soh ON sod.SalesOrderID = soh.SalesOrderID
INNER JOIN Production.ProductSubcategory ps ON p.ProductSubcategoryID = ps.ProductSubcategoryID
WHERE soh.OrderDate BETWEEN '1/1/2014' AND '12/31/2014'
AND p.ProductSubcategoryID IN (1,2)
GROUP BY ps.Name
HAVING ps.Name IN ('Mountain Bikes', 'Road Bikes')
<एच3>3. कम्पोजिट जॉइन

आप इसे जोड़ने के लिए 2 कुंजियों का उपयोग करके 2 तालिकाओं को भी जोड़ सकते हैं। नीचे नमूना देखें। यह एक AND ऑपरेटर के साथ 2 जुड़ने की शर्तों का उपयोग करता है।

SELECT
 a.column1
,b.column1
,b.column2
FROM Table1 a
INNER JOIN Table2 b ON a.column1 = b.column1 AND a.column2 = b.column2
<एच3>4. नेस्टेड लूप फिजिकल जॉइन का उपयोग करके इनर जॉइन करें

नीचे दिए गए उदाहरण में, उत्पाद तालिका में 9 रिकॉर्ड हैं - एक छोटा सेट। सम्मिलित तालिका है SalesOrderDetail - एक बड़ा सेट। क्वेरी ऑप्टिमाइज़र नेस्टेड लूप जॉइन का उपयोग करेगा, जैसा कि चित्र 8 में दिखाया गया है।

USE AdventureWorks
GO

SELECT
 sod.SalesOrderDetailID
,sod.ProductID
,P.Name
,P.ProductNumber
,sod.OrderQty
FROM Sales.SalesOrderDetail sod
INNER JOIN Production.Product p ON sod.ProductID = p.ProductID
WHERE P.ProductSubcategoryID IN(25, 31, 33);

5. मर्ज फिजिकल जॉइन का उपयोग करके INNER जॉइन करें

नीचे दिया गया उदाहरण मर्ज जॉइन का उपयोग करता है क्योंकि दोनों इनपुट टेबल SalesOrderID द्वारा सॉर्ट किए जाते हैं।

SELECT
 soh.SalesOrderID
,soh.OrderDate
,sod.SalesOrderDetailID
,sod.ProductID
,sod.LineTotal
FROM Sales.SalesOrderHeader soh
INNER JOIN sales.SalesOrderDetail sod ON soh.SalesOrderID = sod.SalesOrderID
<एच3>6. हैश फिजिकल जॉइन का उपयोग करके इनर जॉइन करें

निम्न उदाहरण हैश जॉइन का उपयोग करेगा:

SELECT
 s.Name AS Store
,SUM(soh.TotalDue) AS TotalSales
FROM Sales.SalesOrderHeader soh
INNER JOIN Sales.Store s ON soh.SalesPersonID = s.SalesPersonID
GROUP BY s.Name
<एच3>7. एडेप्टिव फिजिकल जॉइन का उपयोग करके इनर जॉइन करें

नीचे दिए गए उदाहरण में, विक्रेता तालिका में क्षेत्र आईडी . पर एक गैर-संकुलित ColumnStore अनुक्रमणिका है कॉलम। क्वेरी ऑप्टिमाइज़र ने नेस्टेड लूप जॉइन का निर्णय लिया, जैसा कि चित्र 11 में दिखाया गया है।

SELECT
sp.BusinessEntityID
,sp.SalesQuota
,st.Name AS Territory
FROM Sales.SalesPerson sp
INNER JOIN Sales.SalesTerritory st ON sp.TerritoryID = st.TerritoryID
WHERE sp.TerritoryID BETWEEN 1 AND 5

8. इनर जॉइन में सबक्वेरी को फिर से लिखने के दो तरीके

नेस्टेड सबक्वेरी के साथ इस कथन पर विचार करें:

SELECT [SalesOrderID], [OrderDate], [ShipDate], [CustomerID]
FROM Sales.SalesOrderHeader 
WHERE [CustomerID] IN (SELECT [CustomerID] FROM Sales.Customer
			WHERE PersonID IN (SELECT BusinessEntityID FROM Person.Person
                                          WHERE lastname LIKE N'I%' AND PersonType='SC'))

यदि आप इसे INNER JOIN में बदलते हैं, तो नीचे दिए गए समान परिणाम सामने आ सकते हैं:

SELECT o.[SalesOrderID], o.[OrderDate], o.[ShipDate], o.[CustomerID]
FROM Sales.SalesOrderHeader o
INNER JOIN Sales.Customer c on o.CustomerID = c.CustomerID
INNER JOIN Person.Person p ON c.PersonID = p.BusinessEntityID
WHERE p.PersonType = 'SC'
AND p.lastname LIKE N'I%'

इसे फिर से लिखने का एक और तरीका है INNER JOIN के लिए तालिका स्रोत के रूप में व्युत्पन्न तालिका का उपयोग करना:

SELECT o.[SalesOrderID], o.[OrderDate], o.[ShipDate], o.[CustomerID]
FROM Sales.SalesOrderHeader o
INNER JOIN (SELECT c.CustomerID, P.PersonType, P.LastName
            FROM Sales.Customer c
            INNER JOIN Person.Person p ON c.PersonID = P.BusinessEntityID
	      WHERE p.PersonType = 'SC'
	        AND p.LastName LIKE N'I%') AS q ON o.CustomerID = q.CustomerID

सभी 3 क्वेरी समान 48 रिकॉर्ड आउटपुट करती हैं।

9. शामिल होने के संकेतों का उपयोग करना

निम्न क्वेरी नेस्टेड लूप का उपयोग करती है:

SELECT
 sod.SalesOrderDetailID
,sod.ProductID
,P.Name
,P.ProductNumber
,sod.OrderQty
FROM Sales.SalesOrderDetail sod
INNER JOIN Production.Product p ON sod.ProductID = p.ProductID
WHERE P.ProductSubcategoryID IN(25, 31, 33);

यदि आप इसे हैश जॉइन करने के लिए बाध्य करना चाहते हैं, तो ऐसा होता है:

SELECT
 sod.SalesOrderDetailID
,sod.ProductID
,P.Name
,P.ProductNumber
,sod.OrderQty
FROM Sales.SalesOrderDetail sod
INNER HASH JOIN Production.Product p ON sod.ProductID = p.ProductID
WHERE P.ProductSubcategoryID IN(25, 31, 33);

हालांकि, ध्यान दें कि सांख्यिकी IO यह दर्शाता है कि जब आप इसे हैश जॉइन करने के लिए बाध्य करेंगे तो प्रदर्शन खराब हो जाएगा।

इस बीच, नीचे दी गई क्वेरी मर्ज जॉइन का उपयोग करती है:

SELECT
 soh.SalesOrderID
,soh.OrderDate
,sod.SalesOrderDetailID
,sod.ProductID
,sod.LineTotal
FROM Sales.SalesOrderHeader soh
INNER JOIN sales.SalesOrderDetail sod ON soh.SalesOrderID = sod.SalesOrderID

जब आप इसे किसी नेस्टेड लूप के लिए बाध्य करते हैं तो यह क्या हो जाता है:

SELECT
 soh.SalesOrderID
,soh.OrderDate
,sod.SalesOrderDetailID
,sod.ProductID
,sod.LineTotal
FROM Sales.SalesOrderHeader soh
INNER LOOP JOIN sales.SalesOrderDetail sod ON soh.SalesOrderID = sod.SalesOrderID

दोनों के आँकड़ों की जाँच करने पर, इसे नेस्टेड लूप में मजबूर करने के लिए क्वेरी को संसाधित करने के लिए अधिक संसाधनों की आवश्यकता होती है:

इस प्रकार, प्रदर्शन के लिए ट्वीक करते समय जुड़ने के संकेतों का उपयोग करना आपका अंतिम उपाय होना चाहिए। अपने SQL सर्वर को इसे आपके लिए संभालने दें।

<एच3>10. UPDATE में INNER JOIN का उपयोग करना

आप अद्यतन विवरण में INNER JOIN का भी उपयोग कर सकते हैं। यहां एक उदाहरण दिया गया है:

UPDATE Sales.SalesOrderHeader
SET ShipDate = getdate() 
FROM Sales.SalesOrderHeader o
INNER JOIN Sales.Customer c on o.CustomerID = c.CustomerID
INNER JOIN Person.Person p ON c.PersonID = p.BusinessEntityID
WHERE p.PersonType = 'SC'

चूंकि UPDATE में शामिल होने का उपयोग करना संभव है, इसलिए DELETE और INSERT का उपयोग करके इसे क्यों न आजमाएं?

एसक्यूएल जॉइन और इनर जॉइन टेकअवे

तो, SQL में शामिल होने में क्या बड़ी बात है?

  • एक SQL JOIN 2 या अधिक तालिकाओं के रिकॉर्ड को मिलाकर एक परिणाम सेट बनाता है।
  • SQL में कई प्रकार के जॉइन होते हैं:INNER, OUTER, और CROSS।
  • डेवलपर या व्यवस्थापक के रूप में, आप तय करते हैं कि आपकी आवश्यकताओं के लिए कौन से तार्किक संचालन या जॉइन प्रकार का उपयोग करना है।
  • दूसरी ओर, क्वेरी ऑप्टिमाइज़र उपयोग करने के लिए सर्वश्रेष्ठ फिजिकल जॉइन ऑपरेटरों का निर्णय करता है। यह नेस्टेड लूप, मर्ज, हैश या एडेप्टिव हो सकता है।
  • आप किस भौतिक जुड़ाव का उपयोग करने के लिए बाध्य करने के लिए जुड़ने के संकेतों का उपयोग कर सकते हैं, लेकिन यह आपका अंतिम उपाय होना चाहिए। ज्यादातर मामलों में, अपने SQL सर्वर को इसे संभालने देना बेहतर होता है।
  • भौतिक जुड़ाव ऑपरेटरों को जानने से आपको क्वेरी प्रदर्शन को ट्यून करने में भी मदद मिलती है।
  • साथ ही, सबक्वेरी को जॉइन का उपयोग करके फिर से लिखा जा सकता है।

इस बीच, इस पोस्ट ने INNER JOINs के 10 उदाहरण दिखाए। यह सिर्फ नमूना कोड नहीं है। उनमें से कुछ में यह निरीक्षण भी शामिल है कि कोड अंदर से बाहर कैसे काम करता है। यह न केवल आपको कोड करने में मदद करने के लिए है बल्कि आपको प्रदर्शन के प्रति सचेत रहने में मदद करने के लिए है। दिन के अंत में, परिणाम न केवल सही होने चाहिए बल्कि तेजी से वितरित भी होने चाहिए।

हम अभी तक नहीं कर रहे हैं। अगला लेख OUTER JOINS से ​​संबंधित होगा। बने रहें।

यह भी देखें

SQL जॉइन आपको एक से अधिक टेबल से डेटा लाने और संयोजित करने देता है। SQL जॉइन के बारे में अधिक जानने के लिए यह वीडियो देखें।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. टी-एसक्यूएल में एक स्ट्रिंग के हिस्से को कैसे बदलें

  2. DevOps को अपने अनुप्रयोग विकास को अनुकूलित करने के लिए DBaaS (डेटाबेस-ए-ए-सर्विस) का उपयोग कैसे करना चाहिए

  3. प्रदर्शन मिथक:स्ट्रिंग कॉलम का आकार बदलना

  4. JDBC RowSet के साथ डेटा फ़िल्टर करना

  5. स्केलग्रिड DBaaS के लिए दो-कारक प्रमाणीकरण सक्षम करना