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

इनर जॉइन के अलावा तीन टेबल जॉइन के साथ जुड़ते हैं

हां, मैं उन तीनों जॉइन का उपयोग करता हूं, हालांकि मैं केवल 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 नहीं।



  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. मैं गिनती (*) कॉलम में उपनाम का उपयोग क्यों नहीं कर सकता और इसे एक खंड में संदर्भित कर सकता हूं?

  3. एसक्यूएल में औसत को गोल करते समय मैं दशमलव कैसे प्राप्त करूं

  4. SQL सर्वर 2016 में नया मेटाडेटा-केवल कॉलम परिवर्तन

  5. मैं SQL सर्वर डेटाबेस में auto_increment प्राथमिक कुंजी कैसे जोड़ूं?