SQL Self Join

Esempio

Una tabella può essere unita a se stessa, con righe diverse che si corrispondono a seconda delle condizioni. In questo caso d'uso, è necessario utilizzare alias per distinguere le due occorrenze della tabella.

Nell'esempio seguente, per ciascun Dipendente nella tabella Dipendenti del database di esempio , viene restituito un record contenente il nome del dipendente insieme al nome corrispondente corrispondente del manager del dipendente. Poiché i manager sono anche dipendenti, la tabella è unita a se stessa:

SELECT 
    e.FName AS "Employee", 
    m.FName AS "Manager"
FROM   
    Employees e
JOIN   
    Employees m 
    ON e.ManagerId = m.Id

Questa query restituirà i seguenti dati:

Dipendente Manager
John Giacomo
Michael Giacomo
Johnathon John

Quindi come funziona?

La tabella originale contiene questi record:

Id FName LName Numero di telefono ManagerID DepartmentID Stipendio Data di assunzione
1 Giacomo fabbro 1234567890 NULLO 1 1000 01-01-2002
2 John Johnson 2468101214 1 1 400 23-03-2005
3 Michael Williams 1357911131 1 2 600 12-05-2009
4 Johnathon fabbro 1212121212 2 1 500 24-07-2016

La prima azione consiste nel creare un prodotto cartesiano di tutti i record nelle tabelle utilizzate nella clausola FROM . In questo caso è la tabella Dipendenti due volte, quindi la tabella intermedia sarà simile a questa (ho rimosso tutti i campi non utilizzati in questo esempio):

e.Id d.nome e.ManagerId m.Id m.FName m.ManagerId
1 Giacomo NULLO 1 Giacomo NULLO
1 Giacomo NULLO 2 John 1
1 Giacomo NULLO 3 Michael 1
1 Giacomo NULLO 4 Johnathon 2
2 John 1 1 Giacomo NULLO
2 John 1 2 John 1
2 John 1 3 Michael 1
2 John 1 4 Johnathon 2
3 Michael 1 1 Giacomo NULLO
3 Michael 1 2 John 1
3 Michael 1 3 Michael 1
3 Michael 1 4 Johnathon 2
4 Johnathon 2 1 Giacomo NULLO
4 Johnathon 2 2 John 1
4 Johnathon 2 3 Michael 1
4 Johnathon 2 4 Johnathon 2

L'azione successiva è quella di mantenere solo i record che soddisfano i criteri di unire, in modo che qualsiasi record in cui il alias e tavolo ManagerId uguale al alias m tavolo Id :

e.Id d.nome e.ManagerId m.Id m.FName m.ManagerId
2 John 1 1 Giacomo NULLO
3 Michael 1 1 Giacomo NULLO
4 Johnathon 2 2 John 1

Quindi, ciascuna espressione utilizzata all'interno della clausola SELECT viene valutata per restituire questa tabella:

d.nome m.FName
John Giacomo
Michael Giacomo
Johnathon John

Infine, i nomi delle colonne e.FName e m.FName sono sostituiti dai loro nomi di colonne di alias, assegnati con l'operatore AS :

Dipendente Manager
John Giacomo
Michael Giacomo
Johnathon John