2012-08-30 15 views
10

के अंत में जॉइन बनाम के बाद एक ऑन कंडीशन में क्या अंतर है, मुझे इसके लिए उत्तर देने में कठिनाई हो रही है, लेकिन .... क्या कोई मुझे मेरे बीच डालने के बीच अंतर बता सकता है जॉइन के साथ जॉइन की दूसरी शर्त सभी अन्य जॉइन के अंत में चालू हो रही है।एसक्यूएल में, एकाधिक जॉइन

यहाँ एक उदाहरण http://sqlfiddle.com/#!3/e0a0f/3

CREATE TABLE TableA (Email VARCHAR(100), SomeNameA VARCHAR(100)) 
CREATE TABLE Tableb (Email VARCHAR(100), SomeNameB VARCHAR(100)) 
CREATE TABLE Tablec (Email VARCHAR(100), SomeNameC VARCHAR(100)) 

INSERT INTO TableA SELECT '[email protected]', 'JoeA' 
INSERT INTO TableA SELECT '[email protected]', 'JaneA' 
INSERT INTO TableA SELECT '[email protected]', 'DaveA' 
INSERT INTO TableB SELECT '[email protected]', 'JoeB' 
INSERT INTO TableB SELECT '[email protected]', 'DaveB' 
INSERT INTO TableC SELECT '[email protected]', 'JoeC' 
INSERT INTO TableC SELECT '[email protected]', 'DaveC' 


SELECT TOP 2 a.*, 
      b.*, 
      c.* 
FROM TableA a 
     LEFT OUTER JOIN TableB b 
        ON a.email = b.email 
     INNER JOIN TableC c 
        ON c.Email = b.email; 

SELECT TOP 2 a.*, 
      b.*, 
      c.* 
FROM TableA a 
     LEFT OUTER JOIN TableB b 
     INNER JOIN TableC c 
        ON c.Email = b.email 
        ON a.email = b.email; 

मुझे समझ नहीं आता क्यों इन दो SELECT स्टेटमेंट्स से भिन्न परिणाम है।

उत्तर

12

जुड़ने के आदेश क्या मायने रखता है। अपने अभिव्यक्तियों का इलाज करें जैसे कि हर कोई अस्थायी "आभासी" तालिका में शामिल हो।

तो तुम

FROM TableA a 
LEFT OUTER JOIN TableB b ON a.email = b.email 
INNER JOIN TableC c ON c.Email = b.email ; 

जब लिखना तो क्रम इस प्रकार है:

  1. TableA अस्थायी संबंध V1
  2. V1TableC के भीतर शामिल हो गए उत्पादन TableB से जुड़ा हुआ छोड़ दिया है।

Meanhwile आप जब लिखें:

FROM TableA a 
LEFT OUTER JOIN TableB b 
INNER JOIN TableC c ON c.Email = b.email ON a.email = b.email; 

तो क्रम इस प्रकार है:

  1. TableBTableC अस्थायी संबंध V1 उत्पादन करने के लिए शामिल हो गए आंतरिक है।
  2. TableAV1 में शामिल हो गया है।

इस प्रकार परिणाम अलग हैं।क्वेरी की पठनीयता में सुधार करने के लिए आमतौर पर ऐसी परिस्थितियों में ब्रांडेसिस का उपयोग करने की अनुशंसा की जाती है:

FROM TableA a 
LEFT OUTER JOIN 
    (TableB b INNER JOIN TableC c ON c.Email = b.email) 
ON a.email = b.email; 
+0

इस पूरी व्याख्या के लिए चीयर्स – MakkyNZ

4

आपके दूसरे उदाहरण में, भाग ON a.email = b.emailLEFT JOIN से संबंधित है।
तो इस तरह लिखा है, इसका मतलब है:

INNER JOIN TableB साथ TableC और LEFT OUTER JOIN TableA साथ परिणाम।

परिणाम तालिका ए से सभी पंक्तियों में शामिल होगा तालिका तालिका से उन पंक्तियों में शामिल होगा जिनके पास टेबलसी में भी प्रवेश है। TableA साथ

LEFT OUTER JOIN TableB और परिणाम के साथ INNER JOIN TableC:

पहला उदाहरण निम्नलिखित का मतलब है। यह TableB के लिए INNER JOIN का उपयोग करने के बराबर है।
स्पष्टीकरण: जब आप LEFT OUTER JOIN टेबलबी के साथ टेबलए आपको टेबलए से सभी पंक्तियां मिलेंगी और टेबलबी में मिलान पंक्तियों के लिए आपको वह डेटा भी मिलेगा। आपके परिणाम सेट में आपके पास b.email = NULL के साथ पंक्तियां होंगी और यह अब तालिका कोड के साथ INNER JOIN एड होगा। जब तक email = NULL के साथ तालिकासी में कोई प्रविष्टि नहीं है, तब तक आपको आपके द्वारा देखे गए परिणाम मिलेंगे।

संबंधित मुद्दे