CodeGym /Corsi /SQL SELF /Auto-join dei dati con SELF JOIN

Auto-join dei dati con SELF JOIN

SQL SELF
Livello 12 , Lezione 3
Disponibile

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 A e table_name B sono la stessa tabella, ma con alias diversi.
  • A.common_column e B.common_column sono 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 è anche employee_id di 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 e sono i "dipendenti".
  • La tabella m sono 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!

2
Compito
SQL SELF, livello 12, lezione 3
Bloccato
Self-join per trovare i manager dei dipendenti
Self-join per trovare i manager dei dipendenti
2
Compito
SQL SELF, livello 12, lezione 3
Bloccato
Self join per trovare prodotti correlati
Self join per trovare prodotti correlati
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION