powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как сделать рекурсию
4 сообщений из 4, страница 1 из 1
Как сделать рекурсию
    #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
Как сделать рекурсию
    #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
Как сделать рекурсию
    #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
Как сделать рекурсию
    #40052555
IDVT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл

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


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