Utilizzo di self-join

Completato

Finora, i join usati hanno coinvolto tabelle diverse. In alcuni scenari potrebbe essere necessario recuperare e confrontare le righe di una tabella con altre righe della stessa tabella. In un'applicazione per le risorse umane, ad esempio, una tabella Employee potrebbe includere informazioni sul responsabile di ogni dipendente e contenere l'ID del manager nella riga del dipendente. Ogni manager è elencato anche come dipendente.

EmployeeID

FirstName

ManagerID

1

Dan

NULL

2

Aisha

1

3

Rosie

1

4

Naomi

3

Per recuperare le informazioni sui dipendenti e associarle al responsabile correlato, è possibile usare la tabella due volte nella query unendola in join a se stessa ai fini della query.

SELECT emp.FirstName AS Employee, 
       mgr.FirstName AS Manager
FROM HR.Employee AS emp
LEFT OUTER JOIN HR.Employee AS mgr
  ON emp.ManagerID = mgr.EmployeeID;

I risultati di questa query includono una riga per ogni dipendente con il nome del responsabile. Il CEO dell'azienda non ha alcun manager. Per includere il CEO nei risultati, viene usato un outer join e il nome del manager viene restituito come NULL per le righe in cui il campo ManagerID non ha nessun campo EmployeeID corrispondente.

Dipendente

Manager

Dan

NULL

Aisha

Dan

Rosie

Dan

Naomi

Rosie

Esistono altri scenari in cui si potrebbe voler confrontare alcune righe di una tabella con righe diverse della stessa tabella. Come si è visto, il confronto tra colonne della stessa riga è abbastanza semplice con T-SQL, ma il metodo per confrontare i valori di righe diverse, ad esempio una riga che contiene l'ora di avvio e un'altra della stessa tabella con l'ora di arresto corrispondente, è meno ovvio. Per questi tipi di query, self-join è una scelta utile.

Per eseguire attività di questo tipo, è utile tenere in considerazione le linee guida seguenti:

  • Definire due istanze della stessa tabella nella clausola FROM e unirle in base alle esigenze, usando inner join o outer join.
  • Usare gli alias di tabella per distinguere le due istanze della stessa tabella.
  • Usare la clausola ON per fornire un filtro che confronta le colonne di un'istanza della tabella con le colonne dell'altra istanza della tabella.