> For the complete documentation index, see [llms.txt](https://kaze.gitbook.io/qa-theory/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kaze.gitbook.io/qa-theory/bazy-dannykh/chto-vy-ponimaete-pod-self-join-privedite-primery..md).

# Что вы понимаете под Self Join? Приведите примеры.

**Self Join** — это соединение таблицы с самой собой. Используется, когда нужно сравнить строки одной таблицы или найти связи внутри неё.

***

### Особенности:

* Таблица упоминается дважды с разными алиасами.
* Логически воспринимается как "две разные таблицы", хотя фактически одна.
* Применяется для иерархий, поиска связей, сравнения строк.

***

### Примеры

#### 1. Иерархия сотрудников (менеджер — подчинённый)

Есть таблица `employees`:

| id | name  | manager\_id |
| -- | ----- | ----------- |
| 1  | Иван  | NULL        |
| 2  | Анна  | 1           |
| 3  | Пётр  | 1           |
| 4  | Ольга | 2           |

Запрос, чтобы показать сотрудника и его менеджера:

```sql
SELECT e.name  AS employee,
       m.name  AS manager
FROM employees e
LEFT JOIN employees m
       ON e.manager_id = m.id;
```

**Результат:**

| employee | manager |
| -------- | ------- |
| Иван     | NULL    |
| Анна     | Иван    |
| Пётр     | Иван    |
| Ольга    | Анна    |

***

#### 2. Поиск "дубликатов" по какому-то полю

Например, хотим найти сотрудников с одинаковыми именами:

```sql
SELECT a.id, a.name, b.id, b.name
FROM employees a
JOIN employees b
  ON a.name = b.name
 AND a.id <> b.id;
```

***

#### 3. Сравнение значений в одной таблице

Например, у нас таблица `flights` с городами отправления и прибытия. Найдём "обратные рейсы":

```sql
SELECT f1.departure, f1.arrival, f2.departure, f2.arrival
FROM flights f1
JOIN flights f2
  ON f1.departure = f2.arrival
 AND f1.arrival = f2.departure;
```
