आत्म-जोड़ का स्पष्टीकरण


84

मुझे आत्म-जुड़ाव की आवश्यकता समझ में नहीं आती। क्या कोई उन्हें मुझे समझा सकता है?

एक सरल उदाहरण बहुत मददगार होगा।

जवाबों:


95

आप स्वयं को दो समान तालिकाओं के रूप में देख सकते हैं। लेकिन सामान्यीकरण में, आप तालिका की दो प्रतियाँ नहीं बना सकते हैं, इसलिए आप केवल दो तालिकाओं को स्व-जुड़ने के साथ अनुकरण करें।

मान लीजिए कि आपके पास दो टेबल हैं:

तालिका 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

1
इस उदाहरण में, मैं यह पता नहीं लगा सकता कि बॉस कौन है। हालांकि यह विस्तार अच्छा और समझने में आसान है।
मैक

2
left joinमुझे लगता है कि बेहतर होगा कि कर्मचारी (या बॉस) को न छोड़ें, जिसके पास बॉस नहीं है; शीर्ष कुत्ता!
रॉकिन

22

यह काफी सामान्य है जब आपके पास एक तालिका होती है जो खुद को संदर्भित करती है। उदाहरण: एक कर्मचारी तालिका जहां प्रत्येक कर्मचारी में एक प्रबंधक हो सकता है, और आप सभी कर्मचारियों और उनके प्रबंधक के नाम को सूचीबद्ध करना चाहते हैं।

SELECT e.name, m.name
FROM employees e LEFT OUTER JOIN employees m
ON e.manager = m.id

18

एक सेल्फ ज्वाइन टेबल अपने आप में शामिल हो जाता है।

एक सामान्य उपयोग मामला तब होता है जब तालिका इकाइयां (रिकॉर्ड) संग्रहीत करती हैं, जिनके बीच एक पदानुक्रमित संबंध होता है । उदाहरण के लिए एक तालिका जिसमें व्यक्ति की जानकारी (नाम, डीओबी, पता ...) और एक कॉलम है जिसमें पिता की आईडी (और / या मां की) शामिल है। फिर एक छोटी सी क्वेरी की तरह

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

हम एक ही क्वेरी में बच्चे और पिता (और माँ दोनों के बारे में, दूसरी सेल्फ जॉइन आदि और यहाँ तक कि ग्रैंड पेरेंट्स आदि ...) के बारे में जानकारी प्राप्त कर सकते हैं।


5

मान लें कि आपके पास एक तालिका है 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

4

यदि आपकी तालिका स्व-संदर्भात्मक है तो वे उपयोगी हैं। उदाहरण के लिए, पृष्ठों की तालिका के लिए, प्रत्येक पृष्ठ में एक nextऔर previousलिंक हो सकता है । ये एक ही तालिका में अन्य पृष्ठों की आईडी होगी। यदि कुछ बिंदु पर आप लगातार पृष्ठों का एक ट्रिपल प्राप्त करना चाहते हैं, तो आप उसी तालिका के स्तंभ के साथ nextऔर previousस्तंभों पर दो स्व-जॉइन करेंगे id


4

एक तालिका की कल्पना करें जिसे 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

4

एक तालिका के लिए स्वयं को संदर्भित करने की क्षमता के बिना, हमें पदानुक्रम स्तरों के लिए कई तालिकाओं का निर्माण करना होगा क्योंकि पदानुक्रम में परतों की संख्या। लेकिन चूंकि यह कार्यक्षमता उपलब्ध है, आप तालिका को खुद से जोड़ते हैं और sql इसे दो अलग-अलग तालिकाओं के रूप में मानता है, इसलिए सब कुछ एक ही स्थान पर अच्छी तरह से संग्रहीत किया जाता है।


लेकिन अब आप (उम्मीद) समझते हैं कि यदि आत्म-संदर्भ उपलब्ध नहीं होता तो क्या होता।
यूजीन

4

ऊपर वर्णित उत्तरों के अलावा (जो बहुत अच्छी तरह से समझाया गया है), मैं एक उदाहरण जोड़ना चाहूंगा ताकि सेल्फ जॉइन के उपयोग को आसानी से दिखाया जा सके। मान लीजिए कि आपके पास 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;

3
+1 यह उत्तर बहुत महत्वपूर्ण है क्योंकि एसओ पर बहुत सारे एसक्यूएल प्रश्न हैं, जिनका उत्तर "सेल्फ ज्वाइन का उपयोग करें" है, जिसे लोग तब नहीं देखते हैं जब उनके पास स्पष्ट (पदानुक्रमित) आत्म संदर्भ न हो।
जिमीबी

1
यहां तक ​​कि यह w3schools से कॉपी पास्ता है, मुझे लगता है कि उपरोक्त उत्तर सेल्फ-ज्वाइन की व्याख्या नहीं करता है लेकिन इनर-जॉइन अलग है।
जॉर्ज के

3

यहाँ कई सही उत्तर हैं, लेकिन एक भिन्नता है जो समान रूप से सही है। आप 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

1
एचएम, पिल्ला में, आप "बराबरी" के बजाय "अधिक से अधिक" क्यों जुड़ते हैं?
मार्सेल

1
नमस्ते। मैंने देखा है कि कुछ उदाहरण "FROM xxx, yyy WHERE" और कुछ अन्य "FROM xxx JOIN yyy WHY" का उपयोग करते हैं। क्या आप कृपया अंतर स्पष्ट कर सकते हैं, कृपया?
13

@Skan यह एक बहुत अच्छा सवाल है। संक्षिप्त उत्तर यह है कि यह पुराना आशुलिपि विधि है और इसे पदावनत किया जाएगा। मैंने दस साल पहले स्कूल में इसका इस्तेमाल किया था और शायद ही कभी इसे अभ्यास में देखा हो। यहाँ सबसे संक्षिप्त विवरण मुझे मिल सकता है: bidn.com/blogs/KathiKellenberger/sql-server/2875/…
BClaydon

1

एक उपयोग का मामला डेटाबेस में डुप्लिकेट रिकॉर्ड के लिए जाँच कर रहा है।

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

डुप्लिकेट को खोजने के लिए एक ग्रुप बाय और एक हाइविंग क्लॉज का उपयोग करना बहुत तेज है। नाम का चयन करें, ईमेल, COUNT ( ) My_Bookings ग्रुप से नाम से, दिनांक HAVING COUNT ( )> 1
जॉर्ज के

@GeorgeK सच। मुझे लगता है कि यह केवल फजी मैच (TRIM (LOWER (नाम)) द्वारा समूहीकृत करने से परे) के लिए आवश्यक है, न कि सख्त समानता के लिए।
स्टीवन स्टीवर्ट-गैलस

1

जब आप स्वयं के साथ तालिका के डेटा का मूल्यांकन करना चाहते हैं तो स्व-जुड़ना उपयोगी होता है। इसका मतलब है कि यह एक ही तालिका से पंक्तियों को सहसंबंधित करेगा।

Syntax: SELECT * FROM TABLE t1, TABLE t2 WHERE t1.columnName = t2.columnName

उदाहरण के लिए, हम उन कर्मचारियों के नाम ढूंढना चाहते हैं, जिनका प्रारंभिक पदनाम वर्तमान पदनाम के बराबर है। हम निम्नलिखित तरीके से सेल्फ ज्वाइन का उपयोग करके इसे हल कर सकते हैं।

SELECT NAME FROM Employee e1, Employee e2 WHERE e1.intialDesignationId = e2.currentDesignationId

0

यह एक लिंक की गई सूची / पेड़ के बराबर डेटाबेस है, जहां एक पंक्ति में कुछ क्षमता में दूसरी पंक्ति में संदर्भ होता है।


वास्तव में, यह देखते हुए कि एक से अधिक पंक्ति एक "माता-पिता" का संदर्भ दे सकती है, यह एक पेड़ भी हो सकता है, जैसे कि कर्मचारी के कर्मचारी के उद्धृत उदाहरण के साथ-> प्रबंधक।
NVRAM

मैं बस एक सरल सादृश्य के लिए कोशिश कर रहा था, लेकिन हाँ एक पेड़ भी काम कर सकता है।
8

-4

यहां आम आदमी के स्व-संबंध में छूट है। सेल्फ जॉइन एक अलग प्रकार की जॉइन नहीं है। यदि आपने अन्य प्रकार के जुड़ावों (इनर, आउटर, और क्रॉस जॉन्स) को समझ लिया है, तो सेल्फ जॉइन सीधे आगे होना चाहिए। INNER, OUTER और CROSS JOINS में, आप 2 या अधिक भिन्न तालिकाओं में शामिल होते हैं। हालाँकि, सेल्फ ज्वाइन में आप उसी तालिका से जुड़ते हैं। यहां, हमारे पास 2 अलग-अलग टेबल नहीं हैं, लेकिन टेबल एलायसेस का उपयोग करके एक ही टेबल को एक अलग टेबल के रूप में मानते हैं। यदि यह अभी भी स्पष्ट नहीं है, तो मैं निम्नलिखित यूट्यूब वीडियो देखने के लिए पुनः आरंभ करूंगा।

स्वयं एक उदाहरण के साथ जुड़ें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.