Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 19.01.2020
Сообщений: 129

Запрос на выборку иерархии родителей

03.01.2025, 20:02. Показов 901. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, коллеги. Прошу вашей помощи, бьюсь весь день, все решения, приходящие в голову отрабатывают неверно.

Суть: есть иерархия отделов (будем называть все это "отделами"). Всего 3 уровня вложенности, есть главный "отдел", у него есть дочерние отделы, а у дочерних отделов есть еще дочерние отделы. Пример цепочки иерархии: 1. Административный департамент => 1.6. Управление административно-хозяйственной деятельности => 1.6.1. Отдел ИТ

Структура БД создана таким образом, что внесены ID отдела и ID отдела-родителя для каждой записи. Нужно брать ID отдела-родителя и искать его родителя выше. Единственное адекватное решение в моей голове - рекурсия и ОТВ, но запросы отрабатывают некорректно, либо после 2 уровня некорректно выводят 3 уровень, либо уже на 2 уровне не хотят видеть родителей правильно. Помогите с решением. В итоге необходимо отобразить иерархию в любом виде: либо в столбцах (3 столбца-уровня), либо объединить concat`ом, не суть.

Неуспешные попытки:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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;
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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;




Структура таблиц:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
CREATE TABLE [dbo].[DepartmentName](
    [Id] [INT] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](180) NOT NULL,
 CONSTRAINT [PK_DepartmentName] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
 
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Departments](
    [Id] [INT] IDENTITY(1,1) NOT NULL,
    [IdDepartmentName] [INT] NOT NULL,
    [IdParentDepartment] [INT] NULL,
 CONSTRAINT [PK_Departments] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
 
SET IDENTITY_INSERT [dbo].[DepartmentName] ON 
 
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (1, N'Административный департамент')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (2, N'Академия Умные дороги')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (3, N'Аналитический отдел')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (4, N'Аппарат управления')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (5, N'Департамент коммуникаций')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (6, N'Департамент маркетинга и партнерских отношений')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (7, N'Департамент по организации корпоративов')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (8, N'Департамент по работе с персоналом')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (9, N'Департамент по работе с промышленностью')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (10, N'Департамент стратегии и планирования')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (11, N'Договорной отдел')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (12, N'Лицензионный отдел')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (13, N'Общий отдел')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (14, N'Операционный отдел')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (15, N'Отдел закупок')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (16, N'Отдел ИТ')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (17, N'Отдел по  привлечению новых клиентов')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (18, N'Отдел по организации и сопровождению мероприятий')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (19, N'Отдел по организации мероприятий')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (20, N'Отдел по работе с корпорациями')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (21, N'Отдел по работе со СМИ')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (22, N'Отдел проектного управления')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (23, N'Отдел протокольного сопровождения')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (24, N'Отдел сетевых программ')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (25, N'Отдел цифровых коммуникаций')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (26, N'Проектно-аналитический отдел')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (27, N'Управление административно-хозяйственной деятельности')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (28, N'Управление безопасности')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (29, N'Управление бухгалтерского и налогового учета')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (30, N'Управление казначейства')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (31, N'Управление маркетинга')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (32, N'Управление нормативного обеспечения и договорной работы')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (33, N'Управление по PR-проектам')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (34, N'Управление по обеспечению безопасности')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (35, N'Управление по развитию бизнеса')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (36, N'Управление по развитию партнерских отношений')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (37, N'Управление Пресс-службы')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (38, N'Управление Финансового планирования и контроля')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (39, N'Учебно-организационный отдел')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (40, N'Финансово-экономический департамент')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (41, N'Финансово-экономическое управление')
INSERT [dbo].[DepartmentName] ([Id], [Name]) VALUES (42, N'Юридический департамент')
SET IDENTITY_INSERT [dbo].[DepartmentName] OFF
GO
SET IDENTITY_INSERT [dbo].[Departments] ON 
 
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (1, 1, NULL)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (2, 2, NULL)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (3, 4, NULL)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (4, 5, NULL)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (5, 6, NULL)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (6, 7, NULL)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (7, 8, NULL)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (8, 9, NULL)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (9, 10, NULL)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (10, 38, NULL)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (11, 40, NULL)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (12, 42, NULL)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (13, 1, 1)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (14, 11, 1)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (15, 13, 1)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (16, 15, 1)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (17, 23, 1)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (18, 27, 1)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (19, 28, 1)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (20, 34, 1)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (21, 2, 2)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (22, 24, 2)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (23, 26, 2)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (24, 39, 2)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (25, 5, 5)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (26, 33, 5)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (27, 37, 5)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (28, 6, 6)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (29, 31, 6)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (30, 35, 6)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (31, 36, 6)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (32, 3, 10)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (33, 22, 10)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (34, 29, 40)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (35, 30, 40)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (36, 40, 40)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (37, 41, 40)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (38, 32, 42)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (39, 42, 42)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (40, 16, 27)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (41, 27, 27)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (42, 18, 33)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (43, 20, 33)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (44, 21, 37)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (45, 25, 37)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (46, 37, 37)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (47, 12, 31)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (48, 31, 31)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (49, 17, 35)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (50, 19, 35)
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (51, 14, 30)
SET IDENTITY_INSERT [dbo].[Departments] OFF

Пример иерархии:

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. Юридический департамент
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.01.2025, 20:02
Ответы с готовыми решениями:

Рекурсивный запрос всех родителей
void Parents(const QString &id,QSet<QString> &parents) { QSqlQuery query; query.exec("SELECT parent FROM table WHERE id = '"...

Если нужно сделать запрос на добавление, зачем предварительно делать запрос на выборку?
Есть таблица: ID_записи, поле1, поле2, поле3. Хотелось бы записать запрос на добавление записи с полем1=!.!. (остальные пустые, кроме...

Запрос по иерархии справочника
Здравствуйте! есть такая проблема: есть справочник "СпецификацияНоменклатуры" в нем табличная часть "ИсходныеКомплектующие",...

16
 Аватар для Аватар
5393 / 1465 / 513
Регистрация: 31.05.2012
Сообщений: 5,153
03.01.2025, 20:54
Цитата Сообщение от AlenaAAAAA Посмотреть сообщение
Всего 3 уровня вложенности
в твоем скрипте создания 5 уровней
и если их реально 3 то рекурсия там как мертвому припарка, элементарно одни запросом
0
0 / 0 / 0
Регистрация: 19.01.2020
Сообщений: 129
03.01.2025, 20:59  [ТС]
Аватар, есть возможность помочь с запросом? Была бы очень благодрана. Свой вариант, до которого дошла выше указала, не помогло...
0
 Аватар для Аватар
5393 / 1465 / 513
Регистрация: 31.05.2012
Сообщений: 5,153
03.01.2025, 21:07
Лучший ответ Сообщение было отмечено AlenaAAAAA как решение

Решение

так сначала с данными разберись, а потом и запрос, у тебя он в правильном направлении, второй, что без рекурсии. только в подзапросе выдерни все с депарвметров, а во внешнем прицепи наименования. ну и where d.IdParentDepartment is null в нужное место втули.

скобок квадратніх наставлено где надо и не надо, вернее везде где не надо )) они же мешают восприятию
1
0 / 0 / 0
Регистрация: 19.01.2020
Сообщений: 129
03.01.2025, 21:29  [ТС]
Аватар, прошу прощения, скрипт так выгружается. Спасибо, попробую!
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
03.01.2025, 21:40
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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,
        cast(concat('/', row_number() over (order by dn.Name), '/') as varchar(max)) as department_path
    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,
        concat(dh.department_path, row_number() over (order by dn.Name), '/') as department_path
    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.department_path,
    dh.FullDepartmentName AS DepartmentHierarchy,
    dh.Level
FROM DepartmentHierarchy dh
order by cast(dh.department_path as hierarchyid);
0
0 / 0 / 0
Регистрация: 19.01.2020
Сообщений: 129
03.01.2025, 21:43  [ТС]
invm, спасибо, попробую
0
0 / 0 / 0
Регистрация: 19.01.2020
Сообщений: 129
04.01.2025, 10:47  [ТС]
invm, не помогло

некорректно определяет уровень вложенности на 3 иерархии, ну и почти всё осталось также, неправильный порядок следования в иерархии.

например, корректный:
4. Департамент коммуникаций 
4.1. Департамент коммуникаций 
4.2. Управление по PR-проектам 
4.2.1. Отдел по организации и сопровождению мероприятий 
4.2.2. Отдел по работе с корпорациями 

в запросе:
/4/Департамент коммуникаций1

или:
5. Департамент маркетинга и партнерских отношений 
5.1. Департамент маркетинга и партнерских отношений 
5.2. Управление маркетинга 
5.2.1. Лицензионный отдел 
5.2.2. Управление маркетинга 

в запросе:
/5/Департамент маркетинга и партнерских отношений1
/5/1/Департамент маркетинга и партнерских отношений > Департамент коммуникаций2
/5/2/Департамент маркетинга и партнерских отношений > Управление по PR-проектам2
/5/3/Департамент маркетинга и партнерских отношений > Управление Пресс-службы2
/5/3/1/Департамент маркетинга и партнерских отношений > Управление Пресс-службы > Отдел ИТ3
/5/3/1/1/Департамент маркетинга и партнерских отношений > Управление Пресс-службы > Отдел ИТ > Управление бухгалтерского и налогового учета4
/5/3/1/2/Департамент маркетинга и партнерских отношений > Управление Пресс-службы > Отдел ИТ > Управление казначейства4
/5/3/1/2/1/Департамент маркетинга и партнерских отношений > Управление Пресс-службы > Отдел ИТ > Управление казначейства > Отдел по привлечению новых клиентов5
/5/3/1/2/2/Департамент маркетинга и партнерских отношений > Управление Пресс-службы > Отдел ИТ > Управление казначейства > Отдел по организации мероприятий5
/5/3/1/3/Департамент маркетинга и партнерских отношений > Управление Пресс-службы > Отдел ИТ > Финансово-экономический департамент4
/5/3/1/4/Департамент маркетинга и партнерских отношений > Управление Пресс-службы > Отдел ИТ > Финансово-экономическое управление4
/5/3/1/4/1/Департамент маркетинга и партнерских отношений > Управление Пресс-службы > Отдел ИТ > Финансово-экономическое управление > Отдел по работе со СМИ5
/5/3/1/4/2/Департамент маркетинга и партнерских отношений > Управление Пресс-службы > Отдел ИТ > Финансово-экономическое управление > Отдел цифровых коммуникаций5
/5/3/1/4/3/Департамент маркетинга и партнерских отношений > Управление Пресс-службы > Отдел ИТ > Финансово-экономическое управление > Управление Пресс-службы5
/5/3/2/Департамент маркетинга и партнерских отношений > Управление Пресс-службы > Управление административно-хозяйственной деятельности3

хотя, Управление Пресс-службы и АХД не является родителем для него, они вообще чужие родители:






вот, что на выводе:
 
/1/ Административный департамент 1
/1/1/ Административный департамент > Административный департамент 2
/1/2/ Административный департамент > Договорной отдел 2
/1/3/ Административный департамент > Общий отдел 2
/1/4/ Административный департамент > Отдел закупок 2
/1/5/ Административный департамент > Отдел протокольного сопровождения 2
/1/6/ Административный департамент > Управление административно-хозяйственной деятельности 2
/1/7/ Административный департамент > Управление безопасности 2
/1/8/ Административный департамент > Управление по обеспечению безопасности 2
/2/ Академия Умные дороги 1
/2/1/ Академия Умные дороги > Академия Умные дороги 2
/2/2/ Академия Умные дороги > Отдел сетевых программ 2
/2/3/ Академия Умные дороги > Проектно-аналитический отдел 2
/2/4/ Академия Умные дороги > Учебно-организационный отдел 2
/3/ Аппарат управления 1
/4/ Департамент коммуникаций 1
/5/ Департамент маркетинга и партнерских отношений 1
/5/1/ Департамент маркетинга и партнерских отношений > Департамент коммуникаций 2
/5/2/ Департамент маркетинга и партнерских отношений > Управление по PR-проектам 2
/5/3/ Департамент маркетинга и партнерских отношений > Управление Пресс-службы 2
/5/3/1/ Департамент маркетинга и партнерских отношений > Управление Пресс-службы > Отдел ИТ 3
/5/3/1/1/ Департамент маркетинга и партнерских отношений > Управление Пресс-службы > Отдел ИТ > Управление бухгалтерского и налогового учета 4
/5/3/1/2/ Департамент маркетинга и партнерских отношений > Управление Пресс-службы > Отдел ИТ > Управление казначейства 4
/5/3/1/2/1/ Департамент маркетинга и партнерских отношений > Управление Пресс-службы > Отдел ИТ > Управление казначейства > Отдел по привлечению новых клиентов 5
/5/3/1/2/2/ Департамент маркетинга и партнерских отношений > Управление Пресс-службы > Отдел ИТ > Управление казначейства > Отдел по организации мероприятий 5
/5/3/1/3/ Департамент маркетинга и партнерских отношений > Управление Пресс-службы > Отдел ИТ > Финансово-экономический департамент 4
/5/3/1/4/ Департамент маркетинга и партнерских отношений > Управление Пресс-службы > Отдел ИТ > Финансово-экономическое управление 4
/5/3/1/4/1/ Департамент маркетинга и партнерских отношений > Управление Пресс-службы > Отдел ИТ > Финансово-экономическое управление > Отдел по работе со СМИ 5
/5/3/1/4/2/ Департамент маркетинга и партнерских отношений > Управление Пресс-службы > Отдел ИТ > Финансово-экономическое управление > Отдел цифровых коммуникаций 5
/5/3/1/4/3/ Департамент маркетинга и партнерских отношений > Управление Пресс-службы > Отдел ИТ > Финансово-экономическое управление > Управление Пресс-службы 5
/5/3/2/ Департамент маркетинга и партнерских отношений > Управление Пресс-службы > Управление административно-хозяйственной деятельности 3
/6/ Департамент по организации корпоративов 1
/6/1/ Департамент по организации корпоративов > Департамент маркетинга и партнерских отношений 2
/6/2/ Департамент по организации корпоративов > Управление маркетинга 2
/6/3/ Департамент по организации корпоративов > Управление по развитию бизнеса 2
/6/3/1/ Департамент по организации корпоративов > Управление по развитию бизнеса > Операционный отдел 3
/6/4/ Департамент по организации корпоративов > Управление по развитию партнерских отношений 2
/6/4/1/ Департамент по организации корпоративов > Управление по развитию партнерских отношений > Лицензионный отдел 3
/6/4/2/ Департамент по организации корпоративов > Управление по развитию партнерских отношений > Управление маркетинга 3
/7/ Департамент по работе с персоналом 1
/8/ Департамент по работе с промышленностью 1
/9/ Департамент стратегии и планирования 1
/10/ Управление Финансового планирования и контроля 1
/10/1/ Управление Финансового планирования и контроля > Аналитический отдел 2
/10/2/ Управление Финансового планирования и контроля > Отдел проектного управления 2
/10/2/1/ Управление Финансового планирования и контроля > Отдел проектного управления > Отдел по организации и сопровождению мероприятий 3
/10/2/1/1/ Управление Финансового планирования и контроля > Отдел проектного управления > Отдел по организации и сопровождению мероприятий > Управление нормативного обеспечения и договорной работы 4
/10/2/1/2/ Управление Финансового планирования и контроля > Отдел проектного управления > Отдел по организации и сопровождению мероприятий > Юридический департамент 4
/10/2/2/ Управление Финансового планирования и контроля > Отдел проектного управления > Отдел по работе с корпорациями 3
/11/ Финансово-экономический департамент 1
/12/ Юридический департамент 1

Добавлено через 1 минуту
Цитата Сообщение от Аватар Посмотреть сообщение
так сначала с данными разберись
Аватар,

А с данными что может быть не так?.... Вроде бы структура корректная
0
 Аватар для Аватар
5393 / 1465 / 513
Регистрация: 31.05.2012
Сообщений: 5,153
04.01.2025, 11:36
Цитата Сообщение от AlenaAAAAA Посмотреть сообщение
А с данными что может быть не так?
они не соответствуют структуре твоих отделов. откуда 5 уровней взялось? там вагон и маленькая тележка ошибок, может не вагон, но тележка точно. внимательно разберись в скрипте что на что ссылается, без тебя ни кто этого не сделает
0
0 / 0 / 0
Регистрация: 19.01.2020
Сообщений: 129
04.01.2025, 14:14  [ТС]
Аватар, 1000 раз проверила данные, все ок, не вижу ошибок, аж глазами сверяла + запросами.
5 уровней вложенности у меня нет по данным, это рекурсия так отрабатывает
пробовала реализовать и иные связи, но в итоге все равно та же проблема

В любом случае, спасибо за советы, может до меня дойдет когда-нибудь)

структура таблиц в нормальном виде такая:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)
);
0
 Аватар для Аватар
5393 / 1465 / 513
Регистрация: 31.05.2012
Сообщений: 5,153
04.01.2025, 15:26
ага, смотрю в книгу вижу фигу. найди например департамент с id=46 и проследи по цепочке родителей от него. если это непосильная задача то сдаюсь )
0
0 / 0 / 0
Регистрация: 19.01.2020
Сообщений: 129
04.01.2025, 15:47  [ТС]
Аватар, их всего по справочнику 42 шт. а самих связей 51, так что 46 быть не может на данный момент. ну, если это не важно, то возьмем любой другой, например, 16 (на 3 ур. вложенности).
 
Id IdDepartmentName IdParentDepartment
40 16 27

беру 27 - родитель

 
Id IdDepartmentName IdParentDepartment
41 27 27

в том случае, если id такой встречается дважды, то нужно найти запись, где IdDepartmentName != IdParentDepartment, т.к. в структуре есть связь подчинения (в этом случае) Управление административно-хозяйственной деятельности - Управление административно-хозяйственной деятельности (а отделы это "разные"). Если id встречается единожды, то берем его и дальше по цепочке.

в нашем случае дважды, ищу запись, где IdDepartmentName != IdParentDepartment

 
Id IdDepartmentName IdParentDepartment
18 27 1

ищу id = 1

 
Id IdDepartmentName IdParentDepartment
1 1 NULL

родитель is null => цепочка закрыта

Отдел ИТ => Управление административно-хозяйственной деятельности => Административный департамент
0
 Аватар для Аватар
5393 / 1465 / 513
Регистрация: 31.05.2012
Сообщений: 5,153
04.01.2025, 15:58
Цитата Сообщение от AlenaAAAAA Посмотреть сообщение
так что 46 быть не может на данный момент
это троллинг такой что-ли? разбуй глаза и посмотри что выложила сюда. это же не я придумал:
T-SQL
1
INSERT [dbo].[Departments] ([Id], [IdDepartmentName], [IdParentDepartment]) VALUES (46, 37, 37)
0
0 / 0 / 0
Регистрация: 19.01.2020
Сообщений: 129
04.01.2025, 16:23  [ТС]
Аватар, иной структуры я не могу придумать. при условии дублирования IdDepartmentName, а он дублируется, нельзя его назначить PK. также как и нельзя организовать связь по-другому именно из-за этого..... еще раз спасибо, когда-нибудь дойду до решения)
0
 Аватар для Аватар
5393 / 1465 / 513
Регистрация: 31.05.2012
Сообщений: 5,153
04.01.2025, 16:29
нормальная у тебя структура, данные не нормальные
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
04.01.2025, 21:18
Цитата Сообщение от AlenaAAAAA Посмотреть сообщение
invm, не помогло
некорректно определяет уровень вложенности на 3 иерархии, ну и почти всё осталось также, неправильный порядок следования в иерархии.
Чудес не бывает.
Запрос работает исключительно по иерархии id -> idParentDepartment
Поэтому, если результат не устраивает - разбирайтесь с исходными данными
Порядок, в пределах idParentDepartment - алфавитный. Ровно как в вашем оригинальном запросе.
Если нужен другой, то, опять же, он должен быть задан в исходных данных.
0
0 / 0 / 0
Регистрация: 19.01.2020
Сообщений: 129
05.01.2025, 17:07  [ТС]
invm, Аватар, ужас, коллеги, я поняла проблему, все получилось, спасибо)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.01.2025, 17:07
Помогаю со студенческими работами здесь

Запрос в иерархии таблиц
Имеется иерархия таблиц ( больница-отделение-палата-койка), каждая дочерняя имеет в качестве вторичного ключа первичный ключ родительской...

Рекурсивный запрос с выводом иерархии и номером узла в ней
Здравствуйте! Пытаюсь начать разбираться в простейших запросах в PostgreeSQL. Помогите, пожалуйста, составить хотя бы пару первых...

Написать запрос, возвращающий пары отец-мать, где для одного из родителей не заполнено или не совпадает поле ИД супруга с другим родителем
Помогите с задачей: Описание. Вся модель состоит из одной таблицы Личность. В таблице Личность содержится ФИО некоторого человека и...

Запрос на выборку
Здравствуйте, господа! Делаю небольшую БД для учета питания, застрял в очень простом на первый взгляд месте: мне нужно получить набор...

Запрос на выборку
Доброе утро, нужно создать запрос на выборку с БД записей с введением определенного параметра, который заранее неизвестный. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru