SELF JOIN è un modo per unire una tabella con sé stessa. Può sembrare strano a prima vista: perché mai dovresti unire una tabella con sé stessa? Ma nella vita reale capita spesso. Per esempio, immagina di avere una tabella dei dipendenti, e ogni dipendente ha un manager. Il manager è anch'esso un dipendente, quindi i suoi dati stanno nella stessa tabella. SELF JOIN ci aiuta ad abbinare i dipendenti ai loro manager.
Parlando in modo formale, SELF JOIN è un normale JOIN, ma usiamo la stessa tabella due volte, dandole alias diversi per distinguere le sue "versioni".
Puoi usare SELF JOIN per:
- Relazioni gerarchiche: stabilire relazioni "genitore-figlio", tipo dipendente e il suo manager.
- Analisi dei dati dentro la tabella: confrontare record nella tabella, tipo trovare prodotti o eventi simili.
- Query complesse su strutture con logica duplicata.
Sintassi di SELF JOIN
Per chiarire subito, ecco la sintassi semplificata di SELF JOIN:
SELECT
A.column_name,
B.column_name
FROM
table_name A
JOIN
table_name B
ON
A.common_column = B.common_column;
Qui:
table_name Aetable_name Bsono la stessa tabella, ma con alias diversi.A.common_columneB.common_columnsono le colonne usate per unire i record.
Gli alias (A e B) servono perché il DBMS "capisca" con quale "copia" della tabella stai lavorando.
Esempi di utilizzo di SELF JOIN
Esempio 1: lista dei dipendenti e dei loro manager
Supponiamo di avere una tabella employees che assomiglia a questa:
| employee_id | name | manager_id |
|---|---|---|
| 1 | Alex Lin | NULL |
| 2 | Maria Chi | 1 |
| 3 | Otto Song | 1 |
| 4 | Nina Zhao | 2 |
In questa tabella:
employee_id— identificatore del dipendente.name— nome del dipendente.manager_id— identificatore del manager, che è ancheemployee_iddi un altro dipendente.
Obiettivo: ottenere la lista dei dipendenti e dei loro manager.
Ecco come risolviamo il problema con SELF JOIN:
SELECT
e.name AS employee_name,
m.name AS manager_name
FROM
employees e
LEFT JOIN
employees m
ON
e.manager_id = m.employee_id;
Risultato:
| employee_name | manager_name |
|---|---|
| Alex Lin | NULL |
| Maria Chi | Alex Lin |
| Otto Song | Alex Lin |
| Nina Zhao | Maria Chi |
Qui:
- La tabella
esono i "dipendenti". - La tabella
msono sempre i "dipendenti", ma nel ruolo di "manager".
Alex Lin non ha un manager (manager_id = NULL), quindi nel risultato il campo manager_name resta vuoto.
Esempio 2: Trovare prodotti simili
Supponiamo di avere una tabella products:
| product_id | product_name | category |
|---|---|---|
| 1 | Frigorifero | Tecnica |
| 2 | Lavatrice | Tecnica |
| 3 | Smartphone | Gadget |
| 4 | Tablet | Gadget |
Obiettivo: trovare coppie di prodotti che appartengono alla stessa categoria.
Soluzione usando SELF JOIN:
SELECT
p1.product_name AS product_1,
p2.product_name AS product_2
FROM
products p1
JOIN
products p2
ON
p1.category = p2.category
AND
p1.product_id < p2.product_id;
Risultato:
| product_1 | product_2 |
|---|---|
| Frigorifero | Lavatrice |
| Smartphone | Tablet |
Nota la condizione p1.product_id < p2.product_id. Serve per evitare duplicati, tipo avere sia Frigorifero — Lavatrice che Lavatrice — Frigorifero nei risultati.
Esempio 3: Analisi delle gerarchie (genitori e figli)
Vediamo un altro esempio. Supponiamo di avere una tabella categories:
| category_id | category_name | parent_id |
|---|---|---|
| 1 | Tecnica | NULL |
| 2 | Gadget | 1 |
| 3 | Computer | 1 |
| 4 | Smartphone | 2 |
Qui:
category_id— identificatore della categoria.category_name— nome della categoria.parent_id— identificatore della categoria genitore.
Obiettivo: abbinare le categorie con le loro categorie genitore.
Query:
SELECT
c1.category_name AS child_category,
c2.category_name AS parent_category
FROM
categories c1
LEFT JOIN
categories c2
ON
c1.parent_id = c2.category_id;
Risultato:
| child_category | parent_category |
|---|---|
| Tecnica | NULL |
| Gadget | Tecnica |
| Computer | Tecnica |
| Smartphone | Gadget |
Errori tipici quando usi SELF JOIN
Dimenticare gli alias: se non usi alias, diventa impossibile distinguere una "copia" della tabella dall'altra.
Riferimenti ciclici: se i dati hanno riferimenti ciclici (tipo un dipendente che è manager di sé stesso), puoi avere risultati strani.
Duplicazione dei risultati: ricordati di filtrare i risultati (per esempio con p1.product_id < p2.product_id) per evitare duplicati.
SELF JOIN è uno strumento potente quando lavori con i dati, e usarlo bene ti permette di risolvere problemi complessi con gerarchie, relazioni interne alle tabelle e analisi dei dati. Spero che ora vedi quanto è utile questo "selfie" nell'universo SQL!
GO TO FULL VERSION