2012-10-10 3 views
9

po 'di codice SQL:più join esterni semantica

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) 

So quello che diversi tipi di join fare, ma quello che vorrei sapere è: per ogni JOIN, quale tabella assume il ruolo di "sinistra " tavolo? Lo table1 avrà sempre il ruolo della tabella "SINISTRA"?

+1

[Ecco una buona spiegazione visiva dei join] (http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html) – Taryn

+2

Sembra interessante, ma io Non sono ancora sicuro di quali siano le semantiche in caso di più join. – Howie

risposta

14

Vengono elaborati in ordine dall'alto al basso, con i join che si associano all '"intero" della clausola FROM precedente.

A parità di condizioni:

  • tab1 è il partner obbligatorio per outer join con la Tab2 socio opzionale
  • quanto sopra è il partner obbligatorio per l'OUTER JOIN con l'TAB4 socio opzionale
  • quanto sopra e tab4 sono entrambi partner obbligatori nell'INNER JOIN
  • quanto sopra è il partner obbligatorio per OUTER JOIN con la scheda partner opzionale5

Tuttavia, il problema con questa query

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 

è che l'INNER JOIN con table3 utilizza una condizione che richiede TAB4 di mettersi in gioco, rendendo praticamente un collegamento obbligatorio di conservare le registrazioni dalla parte sinistra, quindi in totale tab1/tab4/tab3 devono unirsi con successo, con tab2 e tab5 opzionale.

+1

Cosa intendi per "A parità di condizioni"? Quale sarebbe un esempio in questo caso di non "a parità di tutte le cose"? –

+0

L'ordine delle colonne nel confronto sull'uguaglianza ha importanza? – user180940