2010-07-29 19 views

risposta

125

Si utilizza un join automatico quando una tabella fa riferimento a dati in sé.

Ad esempio, una tabella Employee può avere una colonna SupervisorID che punta al dipendente che è il capo del dipendente attuale.

per interrogare i dati e ottenere informazioni sia per le persone in una riga, si potrebbe unirsi a sé in questo modo:

select e1.EmployeeID, 
    e1.FirstName, 
    e1.LastName, 
    e1.SupervisorID, 
    e2.FirstName as SupervisorFirstName, 
    e2.LastName as SupervisorLastName 
from Employee e1 
left outer join Employee e2 on e1.SupervisorID = e2.EmployeeID 
+0

Che assomiglia a un self join esterno a me? –

+2

@JoeCaruso Questo perché è;) – RedFilter

+2

Mi chiedo perché nessuno enfatizzi la parte "nella stessa fila". Non è questo il punto intero di fare un auto join? –

14

Un self join è semplicemente quando si partecipa a un tavolo con se stesso. Non esiste una parola chiave SELF JOIN, è sufficiente scrivere un join ordinario in cui entrambe le tabelle coinvolte nel join sono la stessa tabella. Una cosa da notare è che quando ci si unisce da soli è necessario usare un alias per la tabella altrimenti il ​​nome della tabella sarebbe ambiguo.

È utile quando si desidera correlare coppie di righe della stessa tabella, ad esempio una relazione padre-figlio. La seguente query restituisce i nomi di tutte le sottocategorie immediate della categoria "Cucina".

SELECT T2.name 
FROM category T1 
JOIN category T2 
ON T2.parent = T1.id 
WHERE T1.name = 'Kitchen' 
+0

Bello vedere questo commento .. ON T2.parent = T1.id (perché influisce sul risultato se interscambiamo 'genitore' e 'id' in esso) – himanshupareek66

+0

Buono a dire che non esiste una parola chiave 'SELF JOIN'. Ero confuso da quella parte! – nclsvh

6

Dovresti utilizzare un self-join su un tavolo che "si riferisce" a se stesso - ad es. una tabella di dipendenti in cui managerid è una chiave esterna per employeeid sulla stessa tabella.

Esempio:

SELECT E.name, ME.name AS manager 
FROM dbo.Employees E 
LEFT JOIN dbo.Employees ME 
ON ME.employeeid = E.managerid 
+0

SU ME.employeeid = E.managerid creerà risultati diversi invece di ON ME.managerid = E.employeeid – himanshupareek66

12

SQL self-join è semplicemente un normale join che viene utilizzato per unire una tabella con se stessa.

Esempio:

Select * 
FROM Table t1, Table t2 
WHERE t1.Id = t2.ID 
+16

Non sarebbe più sicuro usare 'SELECT t1. *' Per evitare duplicati di nomi di colonna nel risultato? – Matthieu

41

Beh, un esempio classico è dove si voleva ottenere un elenco di dipendenti e dei loro immediati manager:

select e.employee as employee, b.employee as boss 
from emptable e, emptable b 
where e.manager_id = b.empolyee_id 
order by 1 

E 'fondamentalmente utilizzato in cui v'è alcuna relazione tra le righe memorizzato nella stessa tabella.

  • dipendenti.
  • marketing multilivello.
  • parti di macchine.

E così via ...

+7

Boo per sintassi non ANSI e utilizzo di ordinale nella clausola 'ORDER BY' anziché di una colonna. – RedFilter

+14

Boo proprio di nuovo a te per aver perso il punto della risposta :-) Tendo ad usare la sintassi più semplice che funziona dal momento che il buon DBMS 'non lascerà che questo influenzi le prestazioni. – paxdiablo

+0

migliore risposta finora ... :) –