Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как сделать рекурсию / 4 сообщений из 4, страница 1 из 1
11.03.2021, 11:50
    #40052550
sysn1k
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать рекурсию
Здравствуйте! Нужна помощь в составлении рекурсии. Не получается. Все задания выполнил (задание приложил), но последнее не правильно выполнил, я показал прямых подчиненных сотрудника 0003. Нужно получить список всех подчиненных. В том числе подчиненных подчиненных. Еще нужно учесть факт, что сотрудник '0010' на данный момент ещё не уволен, он уволится только со следующей недели.

Пытаюсь сделать рекурсию, но при компиляции выдает ошибку "Все запросы, объединенные с помощью операторов UNION, INTERSECT или EXCEPT, должны иметь одинаковое число выражений в целевых списках." Подскажите, как ее правильно сделать.

Код: 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.
IF OBJECT_ID('employes') IS NOT NULL
DROP TABLE employes

IF OBJECT_ID('employes') IS NULL
CREATE TABLE employes(
ID int IDENTITY (1,1) PRIMARY KEY ,
Code varchar(50) not null UNIQUE,
Post varchar(50) not null,
Name varchar(255) not null,
DateBegin date not null,
DateEnd date null,
ID_Parent int null 
);
GO 

INSERT employes values 
('0001','General director','Ivanov','20000101', NULL, NULL),
('0002','The leader of team 1','Petrov','20000101', NULL, NULL),
('0003','The leader of team 2','Sidorov','20000101', NULL, NULL),
('0004','Employe 1','Klyshkina','20000101', NULL, NULL),
('0005','Employe 2','Mishustina','20000101', NULL, NULL),
('0006','Employe 3','Kotelnikov','20000101', NULL, NULL),
('0007','Employe 4','Sidelnikova','20000101', NULL, NULL),
('0008','Employe 5','Mokrushin','20000101', '20200502', NULL),
('0009','Employe 6','Malenkay','20000101', NULL, NULL),
('0010','Employe 7','Bolshoy','20000101', '20210315', NULL),
('0011','Employe 8','Ivanov','20000101', NULL, NULL),
('0012','Employe 9','Sidorov','20000101', NULL, NULL);

UPDATE employes SET ID_Parent = 1
WHERE code = '0002' OR code = '0003'
UPDATE employes SET ID_Parent = 2
WHERE code = '0004' OR code = '0005' OR code = '0006'
UPDATE employes SET ID_Parent = 3
WHERE code = '0007' OR code = '0008' OR code = '0009'
UPDATE employes SET ID_Parent = 9
WHERE code = '0010' OR code = '0011'
UPDATE employes SET ID_Parent = 11
WHERE code = '0012';


WITH Subordinates AS (
SELECT * FROM employes AS e
WHERE e.ID = 3

UNION ALL

SELECT * FROM employes AS e
JOIN Subordinates AS sub ON e.ID_Parent = sub.ID
)

SELECT * FROM Subordinates
...
Рейтинг: 0 / 0
11.03.2021, 12:09
    #40052551
Агрох
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать рекурсию
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
WITH Subordinates AS (
SELECT * FROM employes AS e
WHERE e.ID = 3

UNION ALL

SELECT * FROM employes AS e
JOIN Subordinates AS sub ON e.ID_Parent = sub.ID
)



В первом запросе "*" тебе вернёт поля из таблицы employes, во втором запросе "*" тебе вернёт все поля из employes и Subordinates - в данном случае все поля будут в двух экземплярах.
Чтобы убрать ошибку "Все запросы, объединенные с помощью операторов UNION, INTERSECT или EXCEPT, должны иметь одинаковое число выражений в целевых списках." скорее всего будет достаточно во втором запросе написать не "*", а "e.*", а лучше напрямую перечислить в обоих запроса конкретные поля и из конкретных таблиц.
...
Рейтинг: 0 / 0
11.03.2021, 12:18
    #40052554
IDVT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать рекурсию
Так же попадут те сотрудники, которые привязаны за уволенным, но пока работают

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
;with Subordinates 
              as(
                   select id
                        , code
                        , 1 as SkipRow 
                   from Employes as e
                   where Code = '0003'

                   union all

                   select parent.Id
                        , parent.Code
                        , case when parent.DateEnd <= @CurrentDate
                               then 1
                               else 0 
                          end as SkipRow
                   from Employes as parent
                          inner join Subordinates as sub 
                                     on parent.ID_Parent = sub.ID
                )
           select Code
           from Subordinates
           where SkipRow = 0
...
Рейтинг: 0 / 0
11.03.2021, 12:18
    #40052555
IDVT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать рекурсию
забыл

Код: sql
1.
declare @CurrentDate Date = Cast( GetDate() as Date)
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как сделать рекурсию / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]