Privacy & Cookie
Questo sito utilizza cookie. Continuando, accetti il loro utilizzo. Ulteriori informazioni, tra cui come controllare i cookie.
Ci sono momenti in cui rivedo le query SQL e trovo persone che usano i JOIN ESTERNI SINISTRI ma poi uso le clausole WHERE che trasformano quei join in JOIN INTERNI. Recentemente come ho detto a qualcuno mi hanno ricordato che dovrei blog su it…so qui sto blogging su di esso. First
Prima di tutto, se non hai familiarità con i diversi JOIN, vai avanti e leggi questo altro suggerimento SQL che ho scritto., Ora, impariamo un po ‘ di più sul JOIN ESTERNO SINISTRO (mi riferirò ad esso semplicemente come il JOIN SINISTRO da qui in poi).
Iniziamo con alcuni dati di esempio. Quanto segue può essere utilizzato all’inizio delle tue query se hai intenzione di eseguire questi test per te stesso. Come puoi vedere, crea due tabelle (variabili di tabella).,
Se si desidera restituire tutti i record “Table1” indipendentemente dal fatto che vi è associato un record “Table2” e di mostrare i dati da “Table2” quando c’è un record associato ci piacerebbe scrivere un LEFT JOIN, in questo modo:
SELECT * FROM @Table1 tb1 LEFT OUTER JOIN @Table2 tb2 ON tb1.colID = tb2.columnID;
Uscita:
Tuttavia, se vogliamo aggiungere una clausola WHERE della query per ottenere solo i dati “Table2” dove l’ID è inferiore a 4 si potrebbe fare qualcosa di simile a questo:
SELECT * FROM @Table1 tb1 LEFT OUTER JOIN @Table2 tb2 ON tb1.colID = tb2.columnID WHERE tb2.columnID < 4;
Uscita:
Ma…hai visto che abbiamo solo i valori in cui c’è un ID corrispondente in entrambe le tabelle?, Hmmm seems sembra agire molto come un JOIN INTERIORE giusto? Perche ‘lo e’. Non mi credi? Dai un’occhiata al piano di esecuzione dopo aver eseguito il JOIN SINISTRO con e senza la condizione WHERE. Ecco cosa vedrai:
Quindi come possiamo aggirare questo problema? Bene, dal momento che stai facendo un LEFT JOIN per cominciare, ovviamente hai bisogno o vuoi restituire tutti i record da “Table1” indipendentemente dai dati in “Table2”., E se davvero non vuoi restituire dati per determinati record in “Table2”, puoi filtrare quei record nel tuo predicato di JOIN (i ‘criteri di ricerca’ nella parte ON del JOIN). Ad esempio, l’ultima query verrebbe scritta in questo modo:
SELECT * FROM @Table1 tb1 LEFT OUTER JOIN @Table2 tb2 ON tb1.colID = tb2.columnID AND tb2.columnID < 4;
Output:
Guarda come otteniamo ancora i 5 record da ” Table1 “ma non i dati da” Table2” che non soddisfano i nostri criteri? Restituisce solo NULL per i dati in quella tabella che non soddisfa i criteri. Abbastanza impressionante destra?,
E can possiamo guardare di nuovo il piano di esecuzione per dimostrare che stiamo effettivamente usando un LEFT JOIN:
Che dire di quando invece di un valore qualcuno usa invece la condizione IS NULL? Bene, in questo caso puoi usarlo nella clausola WHERE.
SELECT * FROM @Table1 tb1 LEFT OUTER JOIN @Table2 tb2 ON tb1.colID = tb2.columnID WHERE tb2.columnID IS NULL;
Output:
E, guardiamo di nuovo il piano di esecuzione:
Si noti che esegue il left join e quindi filtra i dati per i record NULL? Questo è quello che vogliamo che faccia e francamente, è quello che probabilmente ci aspettavamo che facesse.
Cosa succede se usiamo IS NOT NULL invece? Beh’s questa è un’altra storia., Rovinerò la sorpresa e ti dirò che farà un JOIN INTERIORE proprio come farebbe con un valore reale. Se non mi credi, vai avanti ed esegui tu stesso la query e guarda il piano di esecuzione.
Quindi, eccolo lì; è così che un LEFT JOIN può o non può essere effettivamente un LEFT JOIN. Speriamo che queste informazioni ti aiutino a scrivere query migliori, o almeno più informate.