Utilizzo di inner join

Completato

Il tipo più frequente di JOIN nelle query T-SQL è INNER JOIN. Gli inner join vengono usati per risolvere molti problemi aziendali comuni, in particolare negli ambienti di database altamente normalizzati. Per recuperare i dati archiviati in più tabelle, spesso è necessario combinarli tramite query INNER JOIN. Un INNER JOIN inizia la fase di elaborazione logica come prodotto cartesiano, che viene quindi filtrato per rimuovere tutte le righe che non corrispondono al predicato.

Elaborazione di un INNER JOIN

Verranno ora esaminati i passaggi seguiti da SQL Server per l'elaborazione logica di una query JOIN. Nell'esempio ipotetico che segue, sono stati aggiunti numeri di riga per maggiore chiarezza:

1) SELECT emp.FirstName, ord.Amount
2) FROM HR.Employee AS emp 
3) JOIN Sales.SalesOrder AS ord
4)      ON emp.EmployeeID = ord.EmployeeID;

Come si può notare, la clausola FROM viene elaborata prima della clausola SELECT. Si segua l'elaborazione a partire dalla riga 2:

  • La clausola FROM specifica la tabella HR.Employee come una delle tabelle di input attribuendo l'alias emp.
  • L'operatore JOIN nella riga 3 riflette l'uso di un INNER JOIN (il tipo predefinito in T-SQL) e specifica Sales.SalesOrder come seconda tabella di input, con alias ord.
  • SQL Server eseguirà un join cartesiano logico su queste tabelle e passerà i risultati come tabella virtuale nel passaggio successivo. (L'elaborazione fisica della query potrebbe non eseguire effettivamente l'operazione del prodotto cartesiano, a seconda delle decisioni dell'ottimizzatore. Può essere comunque utile immaginare il prodotto cartesiano creato).
  • Usando la clausola ON, SQL Server filtra la tabella virtuale, mantenendo solo le righe in cui un valore EmployeeID della tabella emp corrisponde a un valore EmployeeID della tabella ord.
  • Le righe restanti rimangono nella tabella virtuale e vengono passate al passaggio successivo nell'istruzione SELECT. In questo esempio la tabella virtuale viene elaborata successivamente dalla clausola SELECT e le due colonne specificate vengono restituite all'applicazione client.

Il risultato della query completata è un elenco di dipendenti e importi degli ordini. I dipendenti a cui non sono associati ordini sono stati filtrati in base alla clausola ON, così come tutti gli ordini che hanno un EmployeeID che non corrisponde a una voce della tabella HR.Employee.

Diagramma di Venn che mostra i membri corrispondenti dei set Employee e SalesOrder

Utilizzo della sintassi INNER JOIN

Inner JOIN è il tipo di JOIN predefinito, la parola chiave facoltativa INNER è implicita nella clausola JOIN. Quando si applica la corrispondenza e si combinano tipi di join, può essere utile specificare il tipo di join in modo esplicito, come illustrato in questo esempio ipotetico:

SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp 
INNER JOIN Sales.SalesOrder AS ord
    ON emp.EmployeeID = ord.EmployeeID;

Quando si scrivono query con inner join, tenere presenti le linee guida seguenti:

  • Gli alias di tabella sono preferibili, non solo per l'elenco SELECT, ma anche per la scrittura della clausola ON.
  • Gli inner join possono essere eseguiti su una singola colonna corrispondente, ad esempio OrderID, oppure su più attributi corrispondenti, ad esempio la combinazione di OrderID e ProductID. I join che specificano più colonne corrispondenti sono detti join composti.
  • L'ordine in cui le tabelle sono elencate nella clausola FROM per un INNER JOIN non è importante per SQL Server Optimizer. Concettualmente, i join verranno valutati da sinistra a destra.
  • Usare la parola chiave JOIN una volta per ogni coppia di tabelle unite in join nell'elenco FROM. Per una query a due tabelle, specificare un join. Per una query a tre tabelle, si userà JOIN due volte: una volta tra le prime due tabelle e un'altra tra l'output di JOIN tra le prime due tabelle e la terza tabella.

Esempi di INNER JOIN

In questo esempio ipotetico viene eseguito un join in una singola colonna corrispondente, mettendo in relazione ProductModelID nella tabella Production.Product con ProductModelID nella tabella Production.ProductModel:

SELECT p.ProductID, m.Name AS Model, p.Name AS Product
FROM Production.Product AS p
INNER JOIN Production.ProductModel AS m
    ON p.ProductModelID = m.ProductModelID
ORDER BY p.ProductID;

L'esempio successivo illustra come un inner join può essere esteso per includere più di due tabelle. La tabella Sales.SalesOrderDetail viene unita in join all'output di JOIN tra Production.Product e Production.ProductModel. Ogni istanza di JOIN/ON esegue il popolamento e il filtro della tabella di output virtuale. SQL Server Query Optimizer determina l'ordine in cui verranno eseguiti i join e i filtri.

SELECT od.SalesOrderID, m.Name AS Model, p.Name AS ProductName, od.OrderQty
FROM Production.Product AS p
INNER JOIN Production.ProductModel AS m
    ON p.ProductModelID = m.ProductModelID
INNER JOIN Sales.SalesOrderDetail AS od
    ON p.ProductID = od.ProductID
ORDER BY od.SalesOrderID;