हां, मैं उन तीनों जॉइन का उपयोग करता हूं, हालांकि मैं केवल LEFT (OUTER) JOIN
का उपयोग करने के लिए चिपक जाता हूं s बाएँ और दाएँ जॉइन को आपस में मिलाने के बजाय। मैं FULL OUTER JOIN
का भी उपयोग करता हूं s और CROSS JOIN
एस.
संक्षेप में, एक INNER JOIN
परिणामसेट को केवल उन रिकॉर्ड तक सीमित करता है जो जॉइन शर्त से संतुष्ट हैं। निम्नलिखित तालिकाओं पर विचार करें
संपादित करें: मैंने टेबल नामों का नाम बदल दिया है और उन्हें @
. के साथ उपसर्ग कर दिया है ताकि इस उत्तर को पढ़ने वाले और प्रयोग करने के इच्छुक किसी भी व्यक्ति के लिए तालिका चर का उपयोग किया जा सके।
यदि आप भी ब्राउज़र में इसके साथ प्रयोग करना चाहते हैं, मैंने इसे SQL Fiddle पर सेट कर दिया है भी;
@Table1
id | name
---------
1 | One
2 | Two
3 | Three
4 | Four
@Table2
id | name
---------
1 | Partridge
2 | Turtle Doves
3 | French Hens
5 | Gold Rings
एसक्यूएल कोड
DECLARE @Table1 TABLE (id INT PRIMARY KEY CLUSTERED, [name] VARCHAR(25))
INSERT INTO @Table1 VALUES(1, 'One');
INSERT INTO @Table1 VALUES(2, 'Two');
INSERT INTO @Table1 VALUES(3, 'Three');
INSERT INTO @Table1 VALUES(4, 'Four');
DECLARE @Table2 TABLE (id INT PRIMARY KEY CLUSTERED, [name] VARCHAR(25))
INSERT INTO @Table2 VALUES(1, 'Partridge');
INSERT INTO @Table2 VALUES(2, 'Turtle Doves');
INSERT INTO @Table2 VALUES(3, 'French Hens');
INSERT INTO @Table2 VALUES(5, 'Gold Rings');
एक INNER JOIN
SQL स्टेटमेंट, id
. पर शामिल हुआ फ़ील्ड
SELECT
t1.id,
t1.name,
t2.name
FROM
@Table1 t1
INNER JOIN
@Table2 t2
ON
t1.id = t2.id
. में परिणाम
id | name | name
----------------
1 | One | Partridge
2 | Two | Turtle Doves
3 | Three| French Hens
एक LEFT JOIN
शामिल होने के बाईं ओर तालिका से सभी रिकॉर्ड के साथ एक परिणामसेट लौटाएगा (यदि आप एक लाइनर के रूप में कथन लिखना चाहते हैं, तो तालिका जो पहले दिखाई देती है) और तालिका में शामिल होने के दाईं ओर फ़ील्ड जो जॉइन एक्सप्रेशन से मेल खाते हैं और SELECT
. में शामिल हैं खंड। अनुपलब्ध विवरण NULL से भरा जाएगा
SELECT
t1.id,
t1.name,
t2.name
FROM
@Table1 t1
LEFT JOIN
@Table2 t2
ON
t1.id = t2.id
में परिणाम
id | name | name
----------------
1 | One | Partridge
2 | Two | Turtle Doves
3 | Three| French Hens
4 | Four | NULL
ए RIGHT JOIN
LEFT JOIN
as के समान तर्क है लेकिन शामिल होने के दाईं ओर से सभी रिकॉर्ड और बाईं ओर से फ़ील्ड लौटाएगा जो कि जॉइन एक्सप्रेशन से मेल खाते हैं और SELECT
में शामिल हैं खंड।
SELECT
t1.id,
t1.name,
t2.name
FROM
@Table1 t1
RIGHT JOIN
@Table2 t2
ON
t1.id = t2.id
में परिणाम
id | name | name
----------------
1 | One | Partridge
2 | Two | Turtle Doves
3 | Three| French Hens
NULL| NULL| Gold Rings
बेशक, FULL OUTER JOIN
. भी है , जिसमें दोनों सम्मिलित तालिकाओं के रिकॉर्ड शामिल हैं और किसी भी अनुपलब्ध . को पॉप्युलेट करता है NULL के साथ विवरण।
SELECT
t1.id,
t1.name,
t2.name
FROM
@Table1 t1
FULL OUTER JOIN
@Table2 t2
ON
t1.id = t2.id
में परिणाम
id | name | name
----------------
1 | One | Partridge
2 | Two | Turtle Doves
3 | Three| French Hens
4 | Four | NULL
NULL| NULL| Gold Rings
और एक CROSS JOIN
(CARTESIAN PRODUCT
), जो कि SELECT
. में बस क्रॉस लागू करने वाले फ़ील्ड का उत्पाद है SELECT
. में फ़ील्ड के साथ एक टेबल से स्टेटमेंट दूसरी तालिका से कथन। ध्यान दें कि CROSS JOIN
में कोई जॉइन एक्सप्रेशन नहीं है
SELECT
t1.id,
t1.name,
t2.name
FROM
@Table1 t1
CROSS JOIN
@Table2 t2
. में परिणाम
id | name | name
------------------
1 | One | Partridge
2 | Two | Partridge
3 | Three | Partridge
4 | Four | Partridge
1 | One | Turtle Doves
2 | Two | Turtle Doves
3 | Three | Turtle Doves
4 | Four | Turtle Doves
1 | One | French Hens
2 | Two | French Hens
3 | Three | French Hens
4 | Four | French Hens
1 | One | Gold Rings
2 | Two | Gold Rings
3 | Three | Gold Rings
4 | Four | Gold Rings
संपादित करें:
कल्पना कीजिए कि अब एक तालिका 3 है
@Table3
id | name
---------
2 | Prime 1
3 | Prime 2
5 | Prime 3
SQL कोड
DECLARE @Table3 TABLE (id INT PRIMARY KEY CLUSTERED, [name] VARCHAR(25))
INSERT INTO @Table3 VALUES(2, 'Prime 1');
INSERT INTO @Table3 VALUES(3, 'Prime 2');
INSERT INTO @Table3 VALUES(5, 'Prime 3');
अब तीनों टेबल INNER JOINS
के साथ जुड़ गए हैं
SELECT
t1.id,
t1.name,
t2.name,
t3.name
FROM
@Table1 t1
INNER JOIN
@Table2 t2
ON
t1.id = t2.id
INNER JOIN
@Table3 t3
ON
t1.id = t3.id
में परिणाम
id | name | name | name
-------------------------------
2 | Two | Turtle Doves | Prime 1
3 | Three| French Hens | Prime 2
यह सोचकर इस परिणाम को समझने में मदद मिल सकती है कि आईडी 2 और 3 वाले रिकॉर्ड ही सभी 3 तालिकाओं के लिए समान हैं और वे क्षेत्र भी हैं जहां हम प्रत्येक तालिका में शामिल हो रहे हैं।
अब तीनों LEFT JOINS
के साथ
SELECT
t1.id,
t1.name,
t2.name,
t3.name
FROM
@Table1 t1
LEFT JOIN
@Table2 t2
ON
t1.id = t2.id
LEFT JOIN
@Table3 t3
ON
t1.id = t3.id
में परिणाम
id | name | name | name
-------------------------------
1 | One | Partridge | NULL
2 | Two | Turtle Doves | Prime 1
3 | Three| French Hens | Prime 2
4 | Four | NULL | NULL
इस परिणाम को समझाने के लिए जोएल का उत्तर एक अच्छी व्याख्या है (तालिका 1 आधार/मूल तालिका है)।
अब INNER JOIN
. के साथ और एक LEFT JOIN
SELECT
t1.id,
t1.name,
t2.name,
t3.name
FROM
@Table1 t1
INNER JOIN
@Table2 t2
ON
t1.id = t2.id
LEFT JOIN
@Table3 t3
ON
t1.id = t3.id
में परिणाम
id | name | name | name
-------------------------------
1 | One | Partridge | NULL
2 | Two | Turtle Doves | Prime 1
3 | Three| French Hens | Prime 2
हालांकि हम यह नहीं जानते हैं कि क्वेरी ऑप्टिमाइज़र किस क्रम में संचालन करेगा, हम परिणाम को समझने के लिए इस क्वेरी को ऊपर से नीचे तक देखेंगे। INNER JOIN
तालिका 1 और तालिका 2 के बीच आईडी पर परिणामसेट को केवल उन रिकॉर्डों तक सीमित कर दिया जाएगा जो शामिल होने की स्थिति से संतुष्ट हैं यानी तीन पंक्तियाँ जिन्हें हमने पहले उदाहरण में देखा था। यह अस्थायी फिर परिणामसेट LEFT JOIN
होगा तालिका 1 और तालिकाओं के बीच आईडी पर तालिका 3 का संस्करण; तालिका 3 में आईडी 2 और 3 के साथ रिकॉर्ड हैं, लेकिन आईडी 1 नहीं, इसलिए t3.name फ़ील्ड में 2 और 3 के लिए विवरण होंगे, लेकिन 1 नहीं।