Konstrukcja self join nie jest niczym specjalnym w SQL. Jest to po prostu powiązanie (join) tabeli samej ze sobą:
SELECT mainAlias.*, joinAlias.*
FROM PEOPLE mainAlias
JOIN PEOPLE joinAlias ON...Kiedy jest to przydatne?
Sytuacja gdy potrzebujemy odwoływać się do tej samej tabeli najczęściej powstaje gdy któraś z kolumn tabeli odwołuje się bezpośrednio do klucza głównego tabeli. Przykładowo mając tabelę PEOPLE zawierającą następujące dane:
| Id | Name | Surname | parentId |
|---|---|---|---|
| 1 | John | Con | |
| 2 | Mark | Con | 1 |
| 3 | Shon | Con | 2 |
widać, że kluczem głównym jest kolumna Id, a kolumną odwołującą się do niego jest kolumna parentId (w tym wypadku wskazująca na to kto jest rodzicem osoby). W celu uzyskania par dziecko-rodzic, można użyć właśnie konstrukcji self join:
SELECT child.Name, child.Surename, parent.Name, parent.Surname
FROM PEOPLE child
JOIN PEOPLE parent ON child.parentId = parent.idco zwraca następujące rezultaty:
| child.Name | child.Surname | parent.Name | parent.Surname |
|---|---|---|---|
| Mark | Con | John | Con |
| Shon | Con | Mark | Con |
Jak widać, nie uzyskaliśmy połączenia pomiędzy John Con a nieistniejącym rodzicem (patrz na osobę o id = 1 w tabeli PEOPLE) – jest to wynik typu powiązania (typu join). Self join pozwala na dowolny typ powiązań (left, righy, inner, outer…).
