Запрос SELECT с переменным количеством столбцов для каждой строки - PullRequest
0 голосов
/ 01 апреля 2019

Я создал таблицу сотрудников.Некоторые из этих сотрудников подчиняются другим сотрудникам, указанным в той же таблице.Давайте назовем их менеджерами.

CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(255) NOT NULL UNIQUE,
    managerID INT NULL,
    FOREIGN KEY (managerID) REFERENCES employees (id) ON DELETE RESTRICT
)  ENGINE=INNODB;

Затем в базу данных будут введены некоторые значения:

INSERT INTO employees(id, name, managerID) 
VALUES          (1, "Ivan", NULL), 
                (2, "Peter", 1),
                (3, "Alexandra", 1),
                (4, "Maria", 2),
                (5, "Marian", 2),
                (6, "Margarita", 3),
                (7, "Mihail", 3),
                (8, "Eva", 6);

Я хочу запрос SELECT, который возвращает всех сотрудников и всех менеджеров, о которых они сообщаютк.На данный момент следующая лучшая вещь, которую я имею, это:

SELECT employee.name AS Name, manager.name AS `Reports to:`
FROM employees,
LEFT JOIN employees AS manager ON employee.managerID = manager.id;

с предсказуемым выводом:

Employee    Reports to:
Ivan        NULL
Peter       Ivan
Alexandra   Ivan
Maria       Peter
Marian      Peter
Margarita   Alexandra
Mihail      Alexandra
Eva         Margarita

Мне нужен такой SELECT запрос, который будет возвращать переменное числостолбцов на основе того, сколько менеджеров имеет один сотрудник.Для меня очевидно, что потребуется рекурсивный SELF JOIN, но я не знаю, как сказать СУБД, что мне нужно переменное число столбцов для каждой строки, и я не знаю, как сформулировать условие.

Желаемый выход: enter image description here

1 Ответ

2 голосов
/ 01 апреля 2019

Я понимаю, что вы хотите сгенерировать набор результатов, в котором каждая запись соответствует сотруднику, со столбцами, в которых показаны все менеджеры этого сотрудника (менеджер сотрудника, затем менеджер менеджера и т. Д.).

Следует помнить, что SQL-запрос должен возвращать фиксированный набор столбцов. СУБД должна заранее знать, сколько столбцов будет возвращено запросом, чтобы иметь возможность его проанализировать и выполнить.

Вот решение, которое может обрабатывать до 5 уровней управления. Это работает, расширяя вашу логику с более LEFT JOIN с. Это не красиво, но это работает. Вы можете добавить мор объединения, чтобы обрабатывать больше уровней управления.

SELECT 
    e0.name AS Name, 
    e1.name AS Manager1, 
    e2.name AS Manager2, 
    e3.name AS Manager3, 
    e4.name AS Manager4, 
    e5.name AS Manager5
FROM employees e0
LEFT JOIN employees e1 ON e1.id = e0.managerID
LEFT JOIN employees e2 ON e2.id = e1.managerID
LEFT JOIN employees e3 ON e3.id = e2.managerID
LEFT JOIN employees e4 ON e4.id = e3.managerID
LEFT JOIN employees e5 ON e5.id = e5.managerID

В это БД Fiddle с вашими примерами данных, запрос возвращает:

| Name      | Manager1  | Manager2  | Manager3 | Manager4 | Manager5 |
| --------- | --------- | --------- | -------- | -------- | -------- |
| Ivan      |           |           |          |          |          |
| Peter     | Ivan      |           |          |          |          |
| Alexandra | Ivan      |           |          |          |          |
| Maria     | Peter     | Ivan      |          |          |          |
| Marian    | Peter     | Ivan      |          |          |          |
| Margarita | Alexandra | Ivan      |          |          |          |
| Mihail    | Alexandra | Ivan      |          |          |          |
| Eva       | Margarita | Alexandra | Ivan     |          |          |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...