मुझे आत्म-जुड़ाव की आवश्यकता समझ में नहीं आती। क्या कोई उन्हें मुझे समझा सकता है?
एक सरल उदाहरण बहुत मददगार होगा।
मुझे आत्म-जुड़ाव की आवश्यकता समझ में नहीं आती। क्या कोई उन्हें मुझे समझा सकता है?
एक सरल उदाहरण बहुत मददगार होगा।
जवाबों:
आप स्वयं को दो समान तालिकाओं के रूप में देख सकते हैं। लेकिन सामान्यीकरण में, आप तालिका की दो प्रतियाँ नहीं बना सकते हैं, इसलिए आप केवल दो तालिकाओं को स्व-जुड़ने के साथ अनुकरण करें।
मान लीजिए कि आपके पास दो टेबल हैं:
emp1
Id Name Boss_id
1 ABC 3
2 DEF 1
3 XYZ 2
emp2
Id Name Boss_id
1 ABC 3
2 DEF 1
3 XYZ 2
अब, यदि आप प्रत्येक कर्मचारी का नाम उसके बॉस के नाम के साथ प्राप्त करना चाहते हैं:
select c1.Name , c2.Name As Boss
from emp1 c1
inner join emp2 c2 on c1.Boss_id = c2.Id
जो निम्न तालिका का उत्पादन करेगा:
Name Boss
ABC XYZ
DEF ABC
XYZ DEF
left join
मुझे लगता है कि बेहतर होगा कि कर्मचारी (या बॉस) को न छोड़ें, जिसके पास बॉस नहीं है; शीर्ष कुत्ता!
यह काफी सामान्य है जब आपके पास एक तालिका होती है जो खुद को संदर्भित करती है। उदाहरण: एक कर्मचारी तालिका जहां प्रत्येक कर्मचारी में एक प्रबंधक हो सकता है, और आप सभी कर्मचारियों और उनके प्रबंधक के नाम को सूचीबद्ध करना चाहते हैं।
SELECT e.name, m.name
FROM employees e LEFT OUTER JOIN employees m
ON e.manager = m.id
एक सेल्फ ज्वाइन टेबल अपने आप में शामिल हो जाता है।
एक सामान्य उपयोग मामला तब होता है जब तालिका इकाइयां (रिकॉर्ड) संग्रहीत करती हैं, जिनके बीच एक पदानुक्रमित संबंध होता है । उदाहरण के लिए एक तालिका जिसमें व्यक्ति की जानकारी (नाम, डीओबी, पता ...) और एक कॉलम है जिसमें पिता की आईडी (और / या मां की) शामिल है। फिर एक छोटी सी क्वेरी की तरह
SELECT Child.ID, Child.Name, Child.PhoneNumber, Father.Name, Father.PhoneNumber
FROM myTableOfPersons As Child
LEFT OUTER JOIN myTableOfPersons As Father ON Child.FatherId = Father.ID
WHERE Child.City = 'Chicago' -- Or some other condition or none
हम एक ही क्वेरी में बच्चे और पिता (और माँ दोनों के बारे में, दूसरी सेल्फ जॉइन आदि और यहाँ तक कि ग्रैंड पेरेंट्स आदि ...) के बारे में जानकारी प्राप्त कर सकते हैं।
मान लें कि आपके पास एक तालिका है users
, जैसे सेट करें:
इस स्थिति में, यदि आप उपयोगकर्ता की जानकारी और प्रबंधक की जानकारी दोनों को एक क्वेरी में खींचना चाहते हैं, तो आप ऐसा कर सकते हैं:
SELECT users.user_id, users.user_name, managers.user_id AS manager_id, managers.user_name AS manager_name INNER JOIN users AS manager ON users.manager_id=manager.user_id
यदि आपकी तालिका स्व-संदर्भात्मक है तो वे उपयोगी हैं। उदाहरण के लिए, पृष्ठों की तालिका के लिए, प्रत्येक पृष्ठ में एक next
और previous
लिंक हो सकता है । ये एक ही तालिका में अन्य पृष्ठों की आईडी होगी। यदि कुछ बिंदु पर आप लगातार पृष्ठों का एक ट्रिपल प्राप्त करना चाहते हैं, तो आप उसी तालिका के स्तंभ के साथ next
और previous
स्तंभों पर दो स्व-जॉइन करेंगे id
।
एक तालिका की कल्पना करें जिसे Employee
नीचे वर्णित किया गया है। सभी कर्मचारियों के पास एक प्रबंधक होता है, जो एक कर्मचारी भी होता है (हो सकता है कि सीईओ को छोड़कर, जिसका प्रबंधक_ शून्य होगा)
Table (Employee):
int id,
varchar name,
int manager_id
फिर आप सभी कर्मचारियों और उनके प्रबंधकों को खोजने के लिए निम्नलिखित चयन का उपयोग कर सकते हैं:
select e1.name, e2.name as ManagerName
from Employee e1, Employee e2 where
where e1.manager_id = e2.id
एक तालिका के लिए स्वयं को संदर्भित करने की क्षमता के बिना, हमें पदानुक्रम स्तरों के लिए कई तालिकाओं का निर्माण करना होगा क्योंकि पदानुक्रम में परतों की संख्या। लेकिन चूंकि यह कार्यक्षमता उपलब्ध है, आप तालिका को खुद से जोड़ते हैं और sql इसे दो अलग-अलग तालिकाओं के रूप में मानता है, इसलिए सब कुछ एक ही स्थान पर अच्छी तरह से संग्रहीत किया जाता है।
ऊपर वर्णित उत्तरों के अलावा (जो बहुत अच्छी तरह से समझाया गया है), मैं एक उदाहरण जोड़ना चाहूंगा ताकि सेल्फ जॉइन के उपयोग को आसानी से दिखाया जा सके। मान लीजिए कि आपके पास CUSTOMERS नाम की एक तालिका है जिसमें निम्नलिखित विशेषताएं हैं: CustomerID, CustomerName, ContactName, City, Country। अब आप उन सभी को सूचीबद्ध करना चाहते हैं जो "एक ही शहर" से हैं। आपको इस तालिका की प्रतिकृति के बारे में सोचना होगा ताकि हम CITY के आधार पर उनसे जुड़ सकें। नीचे दी गई क्वेरी स्पष्ट रूप से दिखाएगी कि इसका क्या मतलब है:
SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2,
A.City
FROM Customers A, Customers B
WHERE A.CustomerID <> B.CustomerID
AND A.City = B.City
ORDER BY A.City;
यहाँ कई सही उत्तर हैं, लेकिन एक भिन्नता है जो समान रूप से सही है। आप WHERE क्लॉज के बजाय जॉइन स्टेटमेंट में अपनी जॉइन की शर्तें रख सकते हैं।
SELECT e1.emp_id AS 'Emp_ID'
, e1.emp_name AS 'Emp_Name'
, e2.emp_id AS 'Manager_ID'
, e2.emp_name AS 'Manager_Name'
FROM Employee e1 RIGHT JOIN Employee e2 ON e1.emp_id = e2.emp_id
ध्यान रखें कभी-कभी आपको e1.manager_id> e2.id चाहिए
दोनों परिदृश्यों को जानने का फायदा कभी-कभी आपको एक टन WHERE या JOIN की स्थिति में होता है और आप अपने कोड को पठनीय रखने के लिए अपने स्वयं के शामिल होने की शर्तों को दूसरे खंड में रखना चाहते हैं।
जब किसी कर्मचारी के पास प्रबंधक नहीं होता है तो किसी ने भी संबोधित नहीं किया है। है ना? वे परिणाम सेट में शामिल नहीं हैं। क्या होगा यदि आप उन कर्मचारियों को शामिल करना चाहते हैं जिनके पास प्रबंधक नहीं हैं लेकिन आप गलत संयोजन नहीं चाहते हैं?
इस पिल्ला की कोशिश करो;
SELECT e1.emp_id AS 'Emp_ID'
, e1.emp_name AS 'Emp_Name'
, e2.emp_id AS 'Manager_ID'
, e2.emp_name AS 'Manager_Name'
FROM Employee e1 LEFT JOIN Employee e2
ON e1.emp_id = e2.emp_id
AND e1.emp_name = e2.emp_name
AND e1.every_other_matching_column = e2.every_other_matching_column
एक उपयोग का मामला डेटाबेस में डुप्लिकेट रिकॉर्ड के लिए जाँच कर रहा है।
SELECT A.Id FROM My_Bookings A, My_Bookings B
WHERE A.Name = B.Name
AND A.Date = B.Date
AND A.Id != B.Id
जब आप स्वयं के साथ तालिका के डेटा का मूल्यांकन करना चाहते हैं तो स्व-जुड़ना उपयोगी होता है। इसका मतलब है कि यह एक ही तालिका से पंक्तियों को सहसंबंधित करेगा।
Syntax: SELECT * FROM TABLE t1, TABLE t2 WHERE t1.columnName = t2.columnName
उदाहरण के लिए, हम उन कर्मचारियों के नाम ढूंढना चाहते हैं, जिनका प्रारंभिक पदनाम वर्तमान पदनाम के बराबर है। हम निम्नलिखित तरीके से सेल्फ ज्वाइन का उपयोग करके इसे हल कर सकते हैं।
SELECT NAME FROM Employee e1, Employee e2 WHERE e1.intialDesignationId = e2.currentDesignationId
यह एक लिंक की गई सूची / पेड़ के बराबर डेटाबेस है, जहां एक पंक्ति में कुछ क्षमता में दूसरी पंक्ति में संदर्भ होता है।
यहां आम आदमी के स्व-संबंध में छूट है। सेल्फ जॉइन एक अलग प्रकार की जॉइन नहीं है। यदि आपने अन्य प्रकार के जुड़ावों (इनर, आउटर, और क्रॉस जॉन्स) को समझ लिया है, तो सेल्फ जॉइन सीधे आगे होना चाहिए। INNER, OUTER और CROSS JOINS में, आप 2 या अधिक भिन्न तालिकाओं में शामिल होते हैं। हालाँकि, सेल्फ ज्वाइन में आप उसी तालिका से जुड़ते हैं। यहां, हमारे पास 2 अलग-अलग टेबल नहीं हैं, लेकिन टेबल एलायसेस का उपयोग करके एक ही टेबल को एक अलग टेबल के रूप में मानते हैं। यदि यह अभी भी स्पष्ट नहीं है, तो मैं निम्नलिखित यूट्यूब वीडियो देखने के लिए पुनः आरंभ करूंगा।