खोज…


परिचय

संरचित क्वेरी भाषा (SQL) में, एक JOIN एक क्वेरी में दो डेटा तालिकाओं को जोड़ने की एक विधि है, जिससे डेटाबेस को एक सेट वापस करने की अनुमति मिलती है जिसमें एक ही बार में दोनों तालिकाओं से डेटा होता है, या एक तालिका से डेटा का उपयोग करके उसे एक के रूप में उपयोग किया जाता है दूसरी टेबल पर फ़िल्टर करें। ANSI SQL मानक के भीतर कई प्रकार के JOINs परिभाषित हैं।

आंतरिक रूप से जुड़ा

Inner join रिटर्न केवल उन रिकॉर्ड / पंक्तियों को मैच / दोनों एक या कई शर्तें (का उपयोग कर निर्दिष्ट स्थान पर आधारित तालिकाओं में मौजूद है ON कीवर्ड)। यह सबसे आम प्रकार का जुड़ाव है। inner join लिए सामान्य वाक्यविन्यास है:

SELECT * 
FROM table_1
INNER JOIN table_2
  ON table_1.column_name = table_2.column_name

इसे केवल JOIN रूप में सरल बनाया जा सकता है:

SELECT * 
FROM table_1
JOIN table_2
  ON table_1.column_name = table_2.column_name

उदाहरण

/* Sample data. */
DECLARE @Animal table (
    AnimalId Int IDENTITY,
    Animal Varchar(20)
);

DECLARE @AnimalSound table (
    AnimalSoundId Int IDENTITY,
    AnimalId Int,
    Sound Varchar(20)
);

INSERT INTO @Animal (Animal) VALUES ('Dog');
INSERT INTO @Animal (Animal) VALUES ('Cat');
INSERT INTO @Animal (Animal) VALUES ('Elephant');

INSERT INTO @AnimalSound (AnimalId, Sound) VALUES (1, 'Barks');
INSERT INTO @AnimalSound (AnimalId, Sound) VALUES (2, 'Meows');
INSERT INTO @AnimalSound (AnimalId, Sound) VALUES (3, 'Trumpets');
/* Sample data prepared. */

SELECT 
    * 
FROM 
    @Animal
    JOIN @AnimalSound
        ON @Animal.AnimalId = @AnimalSound.AnimalId;
AnimalId    Animal               AnimalSoundId AnimalId    Sound
----------- -------------------- ------------- ----------- --------------------
1           Dog                  1             1           Barks
2           Cat                  2             2           Meows
3           Elephant             3             3           Trumpets

बाएं बाहरी जुड़ाव के साथ आंतरिक जुड़ाव का उपयोग करना (मौजूद नहीं है)

यह क्वेरी तालिका 1 से डेटा लौटाएगी, जहां तालिका 2 के साथ मेल खाने वाले फ़ील्ड कुंजी और डेटा के साथ तालिका 1 में नहीं हैं जब किसी शर्त और कुंजी के साथ तालिका 2 के साथ तुलना की जाती है

select * 
  from Table1 t1
    inner join Table2 t2 on t1.ID_Column = t2.ID_Column 
    left  join Table3 t3 on t1.ID_Column = t3.ID_Column 
  where t2.column_name = column_value 
    and t3.ID_Column is null 
  order by t1.column_name;

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

A cross join एक कार्टेशियन जॉइन है, जिसका अर्थ है दोनों टेबल का कार्टेशियन प्रोडक्ट। इस जॉइन को दो टेबल से जुड़ने के लिए किसी शर्त की जरूरत नहीं है। बाईं तालिका में प्रत्येक पंक्ति दाईं तालिका की प्रत्येक पंक्ति में शामिल हो जाएगी। एक क्रॉस जॉइन के लिए सिंटैक्स:

SELECT * FROM table_1
CROSS JOIN table_2 

उदाहरण:

/* Sample data. */
DECLARE @Animal table (
    AnimalId Int IDENTITY,
    Animal Varchar(20)
);

DECLARE @AnimalSound table (
    AnimalSoundId Int IDENTITY,
    AnimalId Int,
    Sound Varchar(20)
);

INSERT INTO @Animal (Animal) VALUES ('Dog');
INSERT INTO @Animal (Animal) VALUES ('Cat');
INSERT INTO @Animal (Animal) VALUES ('Elephant');

INSERT INTO @AnimalSound (AnimalId, Sound) VALUES (1, 'Barks');
INSERT INTO @AnimalSound (AnimalId, Sound) VALUES (2, 'Meows');
INSERT INTO @AnimalSound (AnimalId, Sound) VALUES (3, 'Trumpet');
/* Sample data prepared. */

SELECT 
    * 
FROM 
    @Animal 
    CROSS JOIN @AnimalSound;

परिणाम:

AnimalId    Animal               AnimalSoundId AnimalId    Sound
----------- -------------------- ------------- ----------- --------------------
1           Dog                  1             1           Barks
2           Cat                  1             1           Barks
3           Elephant             1             1           Barks
1           Dog                  2             2           Meows
2           Cat                  2             2           Meows
3           Elephant             2             2           Meows
1           Dog                  3             3           Trumpet
2           Cat                  3             3           Trumpet
3           Elephant             3             3           Trumpet

ध्यान दें कि ऐसे अन्य तरीके हैं जो एक CROSS JOIN को लागू किया जा सकता है। यह एक "पुरानी शैली" जॉइन है (एएनएसआई एसक्यूएल -92 के बाद से पदावनत), जिसमें कोई शर्त नहीं है, जिसके परिणामस्वरूप क्रॉस / कार्टेशियन जॉइन होता है:

SELECT * 
FROM @Animal, @AnimalSound;

यह सिंटैक्स "हमेशा सत्य" स्थिति में शामिल होने के कारण भी काम करता है, लेकिन इसकी सिफारिश नहीं की जाती है और इसे पठनीयता के लिए, स्पष्ट CROSS JOIN सिंटैक्स के पक्ष में, बचा जाना चाहिए।

SELECT * 
FROM 
    @Animal 
    JOIN @AnimalSound 
        ON 1=1

बाहरी सम्मिलित हों

बाईं ओर का बाहरी जोड़

LEFT JOIN ओर से बाईं पंक्ति में सभी पंक्तियाँ मिलती हैं, दाएं तालिका की पंक्तियों से मेल खाती है जहाँ ON खंड की शर्तें पूरी होती हैं। जिन पंक्तियों में ON खण्ड पूरा नहीं हुआ है, उनमें दाईं ओर के सभी स्तंभों में NULL है। एक LEFT JOIN का सिंटैक्स है:

SELECT * FROM table_1 AS t1
LEFT JOIN table_2 AS t2 ON t1.ID_Column = t2.ID_Column 

राइट आउटर जॉइन

RIGHT JOIN दायीं मेज से सभी पंक्तियों को लौटाता है, जहां बाईं खण्ड ON पंक्तियों से मिलान किया जाता है, जहां ON खंड की शर्तें पूरी होती हैं। जिन पंक्तियों में ON खण्ड पूरा नहीं हुआ है, उनमें बाईं तालिका के सभी स्तंभों में NULL है। RIGHT JOIN का सिंटैक्स है:

SELECT * FROM table_1 AS t1
RIGHT JOIN table_2 AS t2 ON t1.ID_Column = t2.ID_Column 

पूर्ण बाहरी सम्मिलित हों

FULL JOIN LEFT JOIN और RIGHT JOIN । सभी पंक्तियों को दोनों तालिकाओं से लौटा दिया जाता है, भले ही ON क्लॉज की शर्तें पूरी हों। ऐसी पंक्तियाँ जो ON क्लॉज को संतुष्ट नहीं करती हैं, उन्हें विपरीत तालिका के सभी कॉलमों में NULL साथ वापस कर दिया जाता NULL (यानी बाईं तालिका में एक पंक्ति के लिए, दाईं तालिका के सभी कॉलमों में NULL और इसके विपरीत होंगे)। एक FULL JOIN का सिंटैक्स है:

SELECT * FROM table_1 AS t1
FULL JOIN table_2 AS t2 ON t1.ID_Column = t2.ID_Column  

उदाहरण

/* Sample test data. */
DECLARE @Animal table (
    AnimalId Int IDENTITY,
    Animal Varchar(20)
);

DECLARE @AnimalSound table (
    AnimalSoundId Int IDENTITY,
    AnimalId Int,
    Sound Varchar(20)
);

INSERT INTO @Animal (Animal) VALUES ('Dog');
INSERT INTO @Animal (Animal) VALUES ('Cat');
INSERT INTO @Animal (Animal) VALUES ('Elephant');
INSERT INTO @Animal (Animal) VALUES ('Frog');

INSERT INTO @AnimalSound (AnimalId, Sound) VALUES (1, 'Barks');
INSERT INTO @AnimalSound (AnimalId, Sound) VALUES (2, 'Meows');
INSERT INTO @AnimalSound (AnimalId, Sound) VALUES (3, 'Trumpet');
INSERT INTO @AnimalSound (AnimalId, Sound) VALUES (5, 'Roars');
/* Sample data prepared. */

बाईं ओर का बाहरी जोड़

SELECT * 
FROM @Animal As t1 
LEFT JOIN @AnimalSound As t2 ON t1.AnimalId = t2.AnimalId;

परिणाम के लिए LEFT JOIN

AnimalId    Animal               AnimalSoundId AnimalId    Sound
----------- -------------------- ------------- ----------- --------------------
1           Dog                  1             1           Barks
2           Cat                  2             2           Meows
3           Elephant             3             3           Trumpet
4           Frog                 NULL          NULL        NULL

सही जॉय शामिल हैं

SELECT * 
FROM @Animal As t1 
RIGHT JOIN @AnimalSound As t2 ON t1.AnimalId = t2.AnimalId;

RIGHT JOIN लिए परिणाम

AnimalId    Animal               AnimalSoundId AnimalId    Sound
----------- -------------------- ------------- ----------- --------------------
1           Dog                  1             1           Barks
2           Cat                  2             2           Meows
3           Elephant             3             3           Trumpet
NULL        NULL                 4             5           Roars

पूरा कंप्यूटर शामिल है

SELECT * 
FROM @Animal As t1 
FULL JOIN @AnimalSound As t2 ON t1.AnimalId = t2.AnimalId;

FULL JOIN लिए परिणाम

AnimalId    Animal               AnimalSoundId AnimalId    Sound
----------- -------------------- ------------- ----------- --------------------
1           Dog                  1             1           Barks
2           Cat                  2             2           Meows
3           Elephant             3             3           Trumpet
4           Frog                 NULL          NULL        NULL
NULL        NULL                 4             5           Roars

एक अद्यतन में शामिल होने का उपयोग करना

जोड़ों को एक UPDATE कथन में भी इस्तेमाल किया जा सकता है:

CREATE TABLE Users (
    UserId int NOT NULL,
    AccountId int NOT NULL,
    RealName nvarchar(200) NOT NULL
)

CREATE TABLE Preferences (
    UserId int NOT NULL,
    SomeSetting bit NOT NULL
)

Users तालिका पर एक विधेय द्वारा फ़िल्टरिंग Preferences तालिका के SomeSetting कॉलम को SomeSetting अपडेट करें:

UPDATE p
SET p.SomeSetting = 1
FROM Users u
JOIN Preferences p ON u.UserId = p.UserId
WHERE u.AccountId = 1234

p कथन के FROM क्लॉज में परिभाषित Preferences लिए एक अन्य नाम है। एक मिलान के साथ केवल पंक्तियों AccountId से Users तालिका अद्यतन किया जाएगा।

लेफ्ट आउटर जॉइन स्टेटमेंट से अपडेट करें

Update t 
SET  t.Column1=100
FROM Table1 t LEFT JOIN Table12 t2 
ON t2.ID=t.ID

भीतरी जुड़ने और कुल कार्य के साथ अद्यतन तालिकाएँ

UPDATE t1
SET t1.field1 = t2.field2Sum
FROM table1 t1
INNER JOIN (select field3, sum(field2) as field2Sum
from table2
group by field3) as t2
on t2.field3 = t1.field3  

एक उपकेंद्र पर शामिल हों

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

यह उदाहरण उपनाम का उपयोग करता है जो कई तालिकाओं को शामिल करने पर प्रश्नों को पढ़ने में आसान बनाता है। इस मामले में हम मूल तालिका खरीद आदेशों से सभी पंक्तियों को पुनर्प्राप्त कर रहे हैं और बाल तालिका PurchaseOrderLineItems से केवल अंतिम (या सबसे हाल ही में) बाल पंक्ति को पुनः प्राप्त कर रहे हैं। यह उदाहरण मानता है कि बच्चे की तालिका वृद्धिशील संख्यात्मक आईडी का उपयोग करती है।

SELECT po.Id, po.PODate, po.VendorName, po.Status, item.ItemNo, 
  item.Description, item.Cost, item.Price
FROM PurchaseOrders po
LEFT JOIN 
     (
       SELECT l.PurchaseOrderId, l.ItemNo, l.Description, l.Cost, l.Price, Max(l.id) as Id 
       FROM PurchaseOrderLineItems l
       GROUP BY l.PurchaseOrderId, l.ItemNo, l.Description, l.Cost, l.Price
     ) AS item ON item.PurchaseOrderId = po.Id

स्वयं सम्मिलित हों

एक तालिका को स्वयं में शामिल किया जा सकता है जिसे एक स्वयं से जुड़ने के रूप में जाना जाता है, एक ही तालिका में अन्य रिकॉर्ड के साथ तालिका में रिकॉर्ड का संयोजन। सेल्फ जॉइन आमतौर पर उन प्रश्नों में उपयोग किया जाता है जहां तालिका के कॉलम में एक पदानुक्रम को परिभाषित किया गया है।

Employees नामक तालिका में नमूना डेटा पर विचार करें:

आईडी नाम Boss_ID
1 बॉब 3
2 जिम 1
3 सैम 2

प्रत्येक कर्मचारी का Boss_ID दूसरे कर्मचारी की ID पर मैप करता है। अपने संबंधित बॉस के नाम के साथ कर्मचारियों की एक सूची को पुनः प्राप्त करने के लिए, इस मानचित्रण का उपयोग करके तालिका को अपने आप से जोड़ा जा सकता है। ध्यान दें कि इस तरह से तालिका में शामिल होने के लिए मूल तालिका से खुद को अलग करने के लिए तालिका के दूसरे संदर्भ में एक उपनाम (इस मामले में Bosses ) के उपयोग की आवश्यकता होती है।

SELECT Employees.Name,
    Bosses.Name AS Boss
FROM Employees
INNER JOIN Employees AS Bosses 
    ON Employees.Boss_ID = Bosses.ID

इस क्वेरी को निष्पादित करने से निम्नलिखित परिणाम प्राप्त होंगे:

नाम मालिक
बॉब सैम
जिम बॉब
सैम जिम

Join का उपयोग करके हटाएं

जॉइन का उपयोग DELETE स्टेटमेंट में भी किया जा सकता है। एक स्कीमा इस प्रकार दिया गया है:

CREATE TABLE Users (
    UserId int NOT NULL,
    AccountId int NOT NULL,
    RealName nvarchar(200) NOT NULL
)

CREATE TABLE Preferences (
    UserId int NOT NULL,
    SomeSetting bit NOT NULL
)

हम Preferences तालिका से पंक्तियों को हटा सकते हैं, Users तालिका पर एक विधेय द्वारा फ़िल्टरिंग निम्नानुसार है:

DELETE p
FROM Users u
INNER JOIN Preferences p ON u.UserId = p.UserId
WHERE u.AccountId = 1234

यहाँ p के लिए एक उपनाम है Preferences में परिभाषित FROM बयान के खंड और हम केवल नष्ट पंक्तियों उससे मिलते-जुलते है AccountId से Users तालिका।

दुर्घटनावश बाहरी जुड़ाव को एक आंतरिक जोड़ में बदल देते हैं

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

Table People
PersonID FirstName
       1 Alice
       2 Bob
       3 Eve

Table Scores
PersonID Subject Score
       1 Math    100
       2 Math     54
       2 Science  98

तालिकाओं में शामिल होना छोड़ दिया:

Select * from People a
left join Scores b
on a.PersonID = b.PersonID

यह दिखाता है:

PersonID FirstName PersonID Subject Score
       1 Alice            1 Math    100
       2 Bob              2 Math     54
       2 Bob              2 Science  98
       3 Eve           NULL NULL   NULL

यदि आप किसी भी लागू गणित स्कोर के साथ, सभी लोगों को वापस करना चाहते हैं, तो एक सामान्य गलती है:

Select * from People a
left join Scores b
on a.PersonID = b.PersonID
where Subject = 'Math'

यह आपके परिणामों से पूर्व संध्या को दूर होता है, बॉब की विज्ञान स्कोर को दूर करने के अलावा, के रूप में Subject है NULL उसके लिए।

गैर-गणित रिकॉर्ड को हटाने के लिए सही सिंटैक्स People तालिका में सभी व्यक्तियों को बनाए रखते हुए होगा:

Select * from People a
left join Scores b
on a.PersonID = b.PersonID
and b.Subject = 'Math'


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow