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

Откуда: большая деревня
Сообщений: 266
Есть таблица, представляющая собой граф (или дерево).
[Q_A](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[QUESTION] [varchar](2000) NULL,
	[ANSWER] [varchar](4000) NULL,
	[PARENT] [int] NULL
)

Здесь parent - идентификатор родительской группы, к которой относится запись. Для корневых групп parent равен null

Есть таблица, в которой фиксируются выбранные пользователем записи
[QUESTIONS_SOCHI](
	[ID] [int] IDENTITY(1,1) NOT NULL,
           [ID_CALL] [int] NULL,
	[QUESTION_ID] [int] NULL
)

здесь id_call - идентификатор текущей сессии, в которой заносятся данные. Для каждого id_call может быть несколько записей.


Требуется написать функцию, которая для введенного id_call выдаст все QUESTION верхней категории (для которой parent null), склеенные в одну строку.

Я написал функцию, но она не рекурсивная и выдает результат только для верхней категории. Рекурсию писать ещё не приходилось.
+
CREATE FUNCTION [dbo].[getquestion2_category]
(
	-- Add the parameters for the function here
	@call_id int
)
RETURNS varchar(2000)
AS
BEGIN
	-- Declare the return variable here
	DECLARE @text varchar(2000)

	-- Add the T-SQL statements to compute the return value here
	set @text = stuff((
			select ', ' + QAP.Question 
			from (
				select distinct parent
				from dbo.Q_A QA 
				inner join dbo.Questioon Q 
				on QA.ID = Q.Question_ID 
				where Q.Call_ID = @call_id 
					and parent IS NOT NULL
			) P
			inner join dbo.Q_A QAP
			on P.parent = QAP.id
			for xml path('')
		),1,2,'')

	-- Return the result of the function
	RETURN @text

END

6 фев 14, 10:57    [15526981]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия по дереву  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
CTE
6 фев 14, 11:08    [15527044]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия по дереву  [new]
virtuOS
Member

Откуда: большая деревня
Сообщений: 266
Понятно, что cte... Не понимаю как.
6 фев 14, 11:34    [15527208]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия по дереву  [new]
Glory
Member

Откуда:
Сообщений: 104751
virtuOS
Понятно, что cte... Не понимаю как.

Т.е. взять из ссылки пример
"К.Использование нескольких привязок и рекурсивных элементов
В следующем примере несколько членов указателя и рекурсивных членов используются для возврата всех предков указанного лица. Создается и заполняется значениями таблица для формирования генеалогии семьи, возвращаемой рекурсивным обобщенным табличным выражением."

не можете ?
6 фев 14, 11:38    [15527232]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия по дереву  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
virtuOS
Понятно, что cte... Не понимаю как.


ну вы покажите, что вы пытались сделать? на чём именно у вас вернулись не те данные?
и мы вам поможем!!! Обязательно!
6 фев 14, 11:38    [15527237]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия по дереву  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
virtuOS
Понятно, что cte... Не понимаю как.
Посмотрите по приведённой ссылке пример
"Г.Использование рекурсивного обобщенного табличного выражения для отображения нескольких уровней рекурсии", и следующие за ним.

Преобразования в строку с помощью for xml path('') делайте в самом запросе снаружи CTE
6 фев 14, 11:38    [15527239]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия по дереву  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
SQL2005: популярные задачи форума и CTE
6 фев 14, 11:42    [15527261]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия по дереву  [new]
virtuOS
Member

Откуда: большая деревня
Сообщений: 266
Я запутался в примерах, вот и попросил помощи. Даже здесь два разных примера написали. Но в итоге получилось, спасибо Glory.

Maxx, если есть способ без рекурсии, напишите. Таблички у меня достаточно небольшие, обычно менее 10 тыс. записей, поэтому работает шустро.

Просветите попутно, как оценить время работы процессора и количество операций чтения, как по ссылке Maxx. В SSMS кнопка "включить статистику клиента" не показывает эту информацию.
6 фев 14, 14:50    [15528914]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия по дереву  [new]
Glory
Member

Откуда:
Сообщений: 104751
virtuOS
если есть способ без рекурсии, напишите

Любая рекурсия эмулируется циклом
6 фев 14, 14:53    [15528945]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия по дереву  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
когда не было цте - писались просто функции по обходу дерева....
Операции чтения - профайлер , или set statistic io
Glory опять же вам сказал - что можно цикл придумать
6 фев 14, 15:22    [15529191]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить