2012-10-10 21 views
9

jakiś kod SQL:Multiple zewnętrzna łączy semantykę

SELECT * 
FROM table1 tab1 
    LEFT OUTER JOIN table2 tab2 ON (tab1.fg = tab2.fg) 
    LEFT OUTER JOIN table4 tab4 ON (tab1.ss = tab4.ss) 
    INNER JOIN table3 tab3 ON (tab4.xya = tab3.xya) 
    LEFT OUTER JOIN table5 tab5 ON (tab4.kk = tab5.kk) 

wiem, jakie są różne typy złączeń zrobić, ale to, co chcę wiedzieć, to: dla każdego JOIN, która tabela przyjmuje rolę „lewicy " stół? Czy table1 zawsze będzie pełniło rolę tabeli "LEWEJ"?

+1

[Oto dobre wizualne wyjaśnienie dołączeń] (http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html) – Taryn

+2

Wygląda świetnie, ale ja "wciąż nie jestem pewien, co to jest semantyka w przypadku wielu złączeń. – Howie

Odpowiedz

14

Są one przetwarzane w kolejności od góry do dołu, z połączeniami wszystkich skojarzonymi z "całością" poprzedniej klauzuli FROM.

Wszystkie rzeczy są równe:

  • tab1 jest obowiązkowe partnerem OUTER JOIN z opcjonalną kartę Karta2 partnerskiego
  • powyższe jest obowiązkowe partnerem OUTER JOIN z opcjonalnym tab4 partnerskiego
  • powyższe i tab4 są obowiązkowymi partnerami w INNER JOIN
  • powyższy jest obowiązkowym partnerem dla OUTER JOIN z opcjonalnym partnerem tab5

Jednak problem z tego zapytania

SELECT * 
FROM table1 tab1 
LEFT OUTER JOIN table2 tab2 ON tab1.fg = tab2.fg 
LEFT OUTER JOIN table4 tab4 ON tab1.ss = tab4.ss 
INNER JOIN table3 tab3 ON tab4.xya = tab3.xya 
LEFT OUTER JOIN table5 tab5 ON tab4.kk = tab5.kk 

jest to, że INNER JOIN z table3 używa warunek, który wymaga tab4 angażować, co czyni go praktycznie obowiązkowy odnośnik do utrzymania rekordy z lewej strony, a więc w Total tab1/tab4/tab3 musi pomyślnie dołączyć, z tab2 i tab5 opcjonalnie.

+1

Co masz na myśli mówiąc "Wszystkie rzeczy są równe"? Jaki byłby przykład w tym przypadku "nie wszystkie rzeczy są równe"? –

+0

Czy kolejność kolumn w porównywaniu równości ma w ogóle znaczenie? – user180940