Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Рекурсивный запрос с выводом головного элемента  [new]
ackidZS
Member

Откуда:
Сообщений: 24
Всем привет.
Есть отличный пример на MSDN по рекурсиям.
INSERT INTO #MyEmployees VALUES (1, N'Ken', N'Sánchez', N'Chief Executive Officer',16,NULL)
INSERT INTO #MyEmployees VALUES  (273, N'Brian', N'Welcker', N'Vice President of Sales',3,1)
INSERT INTO #MyEmployees VALUES  (274, N'Stephen', N'Jiang', N'North American Sales Manager',3,273)
INSERT INTO #MyEmployees VALUES  (275, N'Michael', N'Blythe', N'Sales Representative',3,274)
INSERT INTO #MyEmployees VALUES  (276, N'Linda', N'Mitchell', N'Sales Representative',3,274)
INSERT INTO #MyEmployees VALUES  (285, N'Syed', N'Abbas', N'Pacific Sales Manager',3,273)
INSERT INTO #MyEmployees VALUES  (286, N'Lynn', N'Tsoflias', N'Sales Representative',3,285)
INSERT INTO #MyEmployees VALUES  (16,  N'David',N'Bradley', N'Marketing Manager', 4, 273)
INSERT INTO #MyEmployees VALUES  (23,  N'Mary', N'Gibson', N'Marketing Specialist', 4, 16);

WITH DirectReports (ManagerID, EmployeeID, Title, Level, Id)
AS
(
	-- Anchor member definition
		SELECT e.ManagerID, e.EmployeeID, e.Title, 
			0 AS Level, 0 as Id 
		FROM #MyEmployees AS e
		WHERE ManagerID IS NULL
		UNION all
	-- Recursive member definition
		SELECT e.ManagerID, e.EmployeeID, e.Title,
			Level + 1, 0 as Id
		FROM #MyEmployees AS e
		INNER JOIN DirectReports AS d
			ON e.ManagerID = d.EmployeeID
)
-- Statement that executes the CTE
SELECT ManagerID, EmployeeID, Title, Level, Id
FROM DirectReports
GO


Как сделать чтобы напротив каждой строчки появился номер головного элемента (самого головного).
Пример:
'Marketing Specialist' -> 'Marketing Manager' -> 'Vice President of Sales' -> 'Chief Executive Officer'
Так вот у строчки 'Marketing Specialist' как показать что он подчиняется 'Chief Executive Officer'...???

Спасибо!
25 ноя 15, 07:17    [18468677]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос с выводом головного элемента  [new]
ackidZS
Member

Откуда:
Сообщений: 24
ВСем спасибо получилось))))
кому интересно напишу как
25 ноя 15, 07:48    [18468700]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос с выводом головного элемента  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
ackidZS,

суперзадача, что ли? Продублируйте поле у верхнего запроса и используйте его в нижнем.
25 ноя 15, 13:37    [18470631]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос с выводом головного элемента  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
Подниму этот вопрос. Мне тоже нужно получить id (имя) головной записи в цепочке.
Помогите пожалуйста. Что-то сложно даются рекурсивные запросы.

Вот готовый запрос, с которого можно начать

declare @t  TABLE 
(
	Id int,
	ParentId int,
	Name nvarchar(max)
);

INSERT INTO @t VALUES 
 (1, null, 'Ken'),
 (2, 1, 'Brian'),
 (3, 2, 'Stephen')



 ;WITH DirectReports (ParentId, Id, Name, Level)
AS
(
	
		SELECT e.ParentId, e.Id, e.Name, 
			0 AS Level
		FROM @t AS e
		WHERE ParentId IS NULL
		UNION all
	
		SELECT e.ParentId, e.Id, e.Name,
			Level + 1
		FROM @t AS e
		INNER JOIN DirectReports AS d
			ON e.ParentId = d.Id
)

SELECT *
FROM DirectReports


Нужно для каждой записи получить "самую верхнюю родительскую" (признаком которой является отсутствие ParentId). В данном примере для записи с именем 'Stephen' нужно получить запись с именем 'Ken'
25 мар 16, 20:14    [18979693]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос с выводом головного элемента  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
ProBiotek,

Добавьте в CTE ещё одно поле - RootID.
Инициализируйте его в первом запросе UNIONа
и просто повторяйте значение этого поля из CTE во втором.
25 мар 16, 20:28    [18979734]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос с выводом головного элемента  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
Ок, спасибо получилось

http://sqlfiddle.com/#!6/9eecb7/6765
26 мар 16, 22:34    [18982557]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить