Начало » Использование СУБД » Microsoft SQL Server » Запрос на выборку иерархии родителей
Запрос на выборку иерархии родителей [сообщение #5846] |
Sat, 04 January 2025 14:27 |
AlenaAlenaAAA
Сообщений: 3 Зарегистрирован: November 2022
|
Junior Member |
|
|
Доброго времени суток, коллеги. Прошу вашей помощи, бьюсь 2 lyz, все решения, приходящие в голову отрабатывают неверно.
Суть: есть иерархия отделов (будем называть все это "отделами"). Всего 3 уровня вложенности, есть главный "отдел", у него есть дочерние отделы, а у дочерних отделов есть еще дочерние отделы. Пример цепочки иерархии: 1. Административный департамент => 1.6. Управление административно-хозяйственной деятельности => 1.6.1. Отдел ИТ
Структура БД создана таким образом, что внесены ID отдела и ID отдела-родителя для каждой записи. Нужно брать ID отдела-родителя и искать его родителя выше. Единственное адекватное решение в моей голове - рекурсия и ОТВ, но запросы отрабатывают некорректно, либо после 2 уровня некорректно выводят 3 уровень, либо уже на 2 уровне не хотят видеть родителей правильно. Помогите с решением. В итоге необходимо отобразить иерархию в любом виде: либо в столбцах (3 столбца-уровня), либо объединить concat`ом, не суть.
Неуспешные попытки:
WITH DepartmentHierarchy AS (
SELECT
d.Id,
dn.Name AS DepartmentName,
d.IdParentDepartment,
1 AS Level,
CAST(dn.Name AS NVARCHAR(MAX)) AS FullDepartmentName,
d.IdDepartmentName
FROM dbo.Departments d
INNER JOIN dbo.DepartmentName dn ON d.IdDepartmentName = dn.Id
WHERE d.IdParentDepartment IS NULL -- Корневые департаменты
UNION ALL
SELECT
d.Id,
dn.Name AS DepartmentName,
d.IdParentDepartment,
dh.Level + 1 AS Level,
CAST(dh.FullDepartmentName + ' > ' + dn.Name AS NVARCHAR(MAX)) AS FullDepartmentName,
d.IdDepartmentName
FROM dbo.Departments d
INNER JOIN dbo.DepartmentName dn ON d.IdDepartmentName = dn.Id
INNER JOIN DepartmentHierarchy dh ON d.IdParentDepartment = dh.Id
)
SELECT
dh.FullDepartmentName AS DepartmentHierarchy,
dh.Level
FROM DepartmentHierarchy dh
ORDER BY dh.Level, dh.FullDepartmentName;
SELECT
d.Id AS DepartmentId,
d1.Name AS Level1, -- Первый уровень (корневой отдел)
d2.Name AS Level2, -- Второй уровень (подразделение корневого отдела)
d3.Name AS Level3 -- Третий уровень (дочернее подразделение)
FROM Departments d
-- Первый уровень: текущий отдел
INNER JOIN DepartmentName d1 ON d1.Id = d.IdDepartmentName
-- Второй уровень: родитель текущего отдела
LEFT JOIN Departments dp ON dp.Id = d.IdParentDepartment
LEFT JOIN DepartmentName d2 ON d2.Id = dp.IdDepartmentName
-- Третий уровень: родитель второго уровня
LEFT JOIN Departments gdp ON gdp.Id = dp.IdParentDepartment
LEFT JOIN DepartmentName d3 ON d3.Id = gdp.IdDepartmentName
ORDER BY Level1, Level2, Level3;
Структура таблиц:
CREATE TABLE DepartmentName
(
Id INT NOT NULL PRIMARY KEY IDENTITY(1,1),
Name nvarchar(180) NOT NULL
);
CREATE TABLE Departments
(
Id INT NOT NULL PRIMARY KEY IDENTITY(1,1),
IdDepartmentName INT NOT NULL,
IdParentDepartment INT,
FOREIGN KEY (IdDepartmentName) REFERENCES DepartmentName(Id),
FOREIGN KEY (IdParentDepartment) REFERENCES DepartmentName(Id)
);
Пример иерархии:
1. Административный департамент
1.1. Административный департамент
1.2. Договорной отдел
1.3. Общий отдел
1.4. Отдел закупок
1.5. Отдел протокольного сопровождения
1.6. Управление административно-хозяйственной деятельности
1.6.1. Отдел ИТ
1.6.2. Управление административно-хозяйственной деятельности
1.7. Управление безопасности
1.8. Управление по обеспечению безопасности
2. Академия Умные дороги
2.1. Академия Умные дороги
2.2. Отдел сетевых программ
2.3. Проектно-аналитический отдел
2.4. Учебно-организационный отдел
3. Аппарат управления
4. Департамент коммуникаций
4.1. Департамент коммуникаций
4.2. Управление по PR-проектам
4.2.1. Отдел по организации и сопровождению мероприятий
4.2.2. Отдел по работе с корпорациями
4.3. Управление Пресс-службы
4.3.1. Отдел по работе со СМИ
4.3.2. Отдел цифровых коммуникаций
4.3.3. Управление Пресс-службы
5. Департамент маркетинга и партнерских отношений
5.1. Департамент маркетинга и партнерских отношений
5.2. Управление маркетинга
5.2.1. Лицензионный отдел
5.2.2. Управление маркетинга
5.3. Управление по развитию бизнеса
5.3.1. Отдел по привлечению новых клиентов
5.3.2. Отдел по организации мероприятий
5.4. Управление по развитию партнерских отношений
6. Департамент по организации корпоративов
7. Департамент по работе с персоналом
8. Департамент по работе с промышленностью
9. Департамент стратегии и планирования
9.1. Аналитический отдел
9.2. Отдел проектного управления
10. Управление Финансового планирования и контроля
11. Финансово-экономический департамент
11.1. Управление бухгалтерского и налогового учета
11.2. Управление казначейства
11.2.1. Операционный отдел
11.3. Финансово-экономический департамент
11.4. Финансово-экономическое управление
12. Юридический департамент
12.1. Управление нормативного обеспечения и договорной работы
12.2. Юридический департамент
|
|
|
Переход к форуму:
Текущее время: Wed Jan 22 13:52:05 GMT+3 2025
Общее время, затраченное на создание страницы: 0.00544 секунд
|