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

Откуда:
Сообщений: 10398
Коллеги, подскажите, как вернуть сортировку согласно соединению
Примерно, хочу изобразить следующее:

CREATE FUNCTION [dbo].[fnGetDepartmentTreeToParent]
(
	@DepartmentID INT
)
RETURNS @return TABLE(
	DepartmentID INT
) 
AS
BEGIN
	DECLARE @ord INT = 0
		
	;WITH Rec(DepartmentID, ParentID, ord) AS
	(
		SELECT d.DepartmentID, d.ParentID, (SELECT @ord = @ord + 1) AS ord
		FROM Departments AS d 
		WHERE d.DepartmentID = @DepartmentID

		UNION ALL 

		SELECT dd.DepartmentID, dd.ParentID, (SELECT @ord = @ord + 1) AS ord
		FROM Departments AS dd 
			INNER JOIN Rec ON Rec.ParentID = dd.DepartmentID
		WHERE dd.IsActive = 1 OR dd.IsActive IS NULL
	) 

	INSERT INTO @return	
	SELECT r.DepartmentID 
	FROM Rec AS r
	ORDER BY r.ord

	RETURN
END


Спасибо
29 янв 16, 16:27    [18746580]     Ответить | Цитировать Сообщить модератору
 Re: Как в рекурсивном CTE сохранить порядок UNION - а ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
MSSQLAndDotNet
как вернуть сортировку согласно соединению

А что это за термин ? Да еще для рекурсии
Уровень вложенности что ли ?
29 янв 16, 16:29    [18746611]     Ответить | Цитировать Сообщить модератору
 Re: Как в рекурсивном CTE сохранить порядок UNION - а ?  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
Glory
MSSQLAndDotNet
как вернуть сортировку согласно соединению

А что это за термин ? Да еще для рекурсии
Уровень вложенности что ли ?

да, уровень вложенности
29 янв 16, 16:31    [18746631]     Ответить | Цитировать Сообщить модератору
 Re: Как в рекурсивном CTE сохранить порядок UNION - а ?  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
Glory
MSSQLAndDotNet
как вернуть сортировку согласно соединению

А что это за термин ? Да еще для рекурсии
Уровень вложенности что ли ?

код просто для примера

есть СТЕ, внутри ЮНИОНом соединяю
вызываю рекурсивно

интересно как сохранить порядок соединения в таком случае



В приведенном коде, это можно решить вычислив уровень вложенности, а в общем случае нет
29 янв 16, 16:34    [18746662]     Ответить | Цитировать Сообщить модератору
 Re: Как в рекурсивном CTE сохранить порядок UNION - а ?  [new]
Владислав Колосов
Member

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

DECLARE @ord INT = 0

		SELECT d.DepartmentID, d.ParentID, cast(0 as int) AS ord
		FROM Departments AS d 
		WHERE d.DepartmentID = @DepartmentID

		UNION ALL 

		SELECT dd.DepartmentID, dd.ParentID, Res.ord + 1 AS ord
		FROM Departments AS dd 
			INNER JOIN Rec ON Rec.ParentID = dd.DepartmentID
		WHERE dd.IsActive = 1 OR dd.IsActive IS NULL
29 янв 16, 16:34    [18746666]     Ответить | Цитировать Сообщить модератору
 Re: Как в рекурсивном CTE сохранить порядок UNION - а ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
	;WITH Rec(DepartmentID, ParentID, ord) AS
	(
		SELECT d.DepartmentID, d.ParentID, 0 AS ord
		FROM Departments AS d 
		WHERE d.DepartmentID = @DepartmentID

		UNION ALL 

		SELECT dd.DepartmentID, dd.ParentID, ord + 1
		FROM Departments AS dd 
			INNER JOIN Rec ON Rec.ParentID = dd.DepartmentID
		WHERE dd.IsActive = 1 OR dd.IsActive IS NULL
	) 

	INSERT INTO @return	
	SELECT r.DepartmentID 
	FROM Rec AS r
	ORDER BY r.ord
29 янв 16, 16:36    [18746684]     Ответить | Цитировать Сообщить модератору
 Re: Как в рекурсивном CTE сохранить порядок UNION - а ?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
MSSQLAndDotNet
а в общем случае нет


именно так, порядок записей определяется только сортировкой при запросе.
29 янв 16, 16:36    [18746688]     Ответить | Цитировать Сообщить модератору
 Re: Как в рекурсивном CTE сохранить порядок UNION - а ?  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
спасибо, все просто
29 янв 16, 16:38    [18746715]     Ответить | Цитировать Сообщить модератору
 Re: Как в рекурсивном CTE сохранить порядок UNION - а ?  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
Владислав Колосов,

зачем CAST ?
29 янв 16, 16:39    [18746726]     Ответить | Цитировать Сообщить модератору
 Re: Как в рекурсивном CTE сохранить порядок UNION - а ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
MSSQLAndDotNet
код просто для примера

есть СТЕ, внутри ЮНИОНом соединяю
вызываю рекурсивно

интересно как сохранить порядок соединения в таком случае

Ваш поток мыслей труднопонимаем
Если вы хотите различать в конечном наборе записи попавшие в него из разных частей UNION-а, то эти разные части UNION-а должны содержать поле(я), значение которого уникально для этой части UNION-а по отношению к другим частям UNION-а
		SELECT d.DepartmentID, d.ParentID, 'Я - первый SELECT ' AS ord
		FROM Departments AS d 
		WHERE d.DepartmentID = @DepartmentID

		UNION ALL 

		SELECT dd.DepartmentID, dd.ParentID, 'А я - второй SELECT ' AS ord
		FROM Departments AS dd 
			INNER JOIN Rec ON Rec.ParentID = dd.DepartmentID
		WHERE dd.IsActive = 1 OR dd.IsActive IS NULL
29 янв 16, 16:41    [18746755]     Ответить | Цитировать Сообщить модератору
 Re: Как в рекурсивном CTE сохранить порядок UNION - а ?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
MSSQLAndDotNet
Владислав Колосов,

зачем CAST ?


А какого 0 типа? Лучше сразу приучить себя явно указывать типы констант, оптимизатор только спасибо за это скажет.
Сегодня это INT, завтра еще что-то...
29 янв 16, 16:47    [18746806]     Ответить | Цитировать Сообщить модератору
 Re: Как в рекурсивном CTE сохранить порядок UNION - а ?  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
Glory
MSSQLAndDotNet
код просто для примера

есть СТЕ, внутри ЮНИОНом соединяю
вызываю рекурсивно

интересно как сохранить порядок соединения в таком случае

Ваш поток мыслей труднопонимаем
Если вы хотите различать в конечном наборе записи попавшие в него из разных частей UNION-а, то эти разные части UNION-а должны содержать поле(я), значение которого уникально для этой части UNION-а по отношению к другим частям UNION-а
		SELECT d.DepartmentID, d.ParentID, 'Я - первый SELECT ' AS ord
		FROM Departments AS d 
		WHERE d.DepartmentID = @DepartmentID

		UNION ALL 

		SELECT dd.DepartmentID, dd.ParentID, 'А я - второй SELECT ' AS ord
		FROM Departments AS dd 
			INNER JOIN Rec ON Rec.ParentID = dd.DepartmentID
		WHERE dd.IsActive = 1 OR dd.IsActive IS NULL

Вы только что мой поток мыслей закодировали на t-sql))
код не сложный, поэтому с потоком все в порядке

Соединения будут происходить рекурсивно, и я хочу знать порядок

Вопрос снят первым примером
Всем спасибо
29 янв 16, 16:51    [18746852]     Ответить | Цитировать Сообщить модератору
 Re: Как в рекурсивном CTE сохранить порядок UNION - а ?  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
Владислав Колосов
MSSQLAndDotNet
Владислав Колосов,

зачем CAST ?


А какого 0 типа? Лучше сразу приучить себя явно указывать типы констант, оптимизатор только спасибо за это скажет.
Сегодня это INT, завтра еще что-то...

ок
29 янв 16, 16:52    [18746859]     Ответить | Цитировать Сообщить модератору
 Re: Как в рекурсивном CTE сохранить порядок UNION - а ?  [new]
a_voronin
Member

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

Я обычно ввожу специальный сортировочный ключ или токен.

Можно сделать что-то в таком виде.

00000001
00000001-00000067-00000037
00000001-00000086
00000002
00000002-00000027-00000033
00000002-00000046
29 янв 16, 17:37    [18747149]     Ответить | Цитировать Сообщить модератору
 Re: Как в рекурсивном CTE сохранить порядок UNION - а ?  [new]
MSSQLAndDotNet
Member

Откуда:
Сообщений: 10398
a_voronin
MSSQLAndDotNet,

Я обычно ввожу специальный сортировочный ключ или токен.

Можно сделать что-то в таком виде.

00000001
00000001-00000067-00000037
00000001-00000086
00000002
00000002-00000027-00000033
00000002-00000046


hierarchyid решает все проблемы
если есть иерархия конечно)
29 янв 16, 17:41    [18747168]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить