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

Откуда:
Сообщений: 34
Существует таблица Groups c полями:
GroupID (ID группы),
ParentGroupID (ID родительской группы) - ссылка на поле GroupID

Подскажите, можно ли начитать всю иерархию дочерних групп (GroupID) по переданной родительской группе (ParentGroupID) без использования курсора.
20 июн 11, 18:19    [10842587]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли обойтись без курсора?  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3752
rakyev
Существует таблица Groups c полями:
GroupID (ID группы),
ParentGroupID (ID родительской группы) - ссылка на поле GroupID

Подскажите, можно ли начитать всю иерархию дочерних групп (GroupID) по переданной родительской группе (ParentGroupID) без использования курсора.

CTE
20 июн 11, 18:26    [10842648]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли обойтись без курсора?  [new]
invm
Member

Откуда: Москва
Сообщений: 9835
Не просто CTE, а рекурсивный CTE.
20 июн 11, 18:29    [10842681]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли обойтись без курсора?  [new]
rakyev
Member

Откуда:
Сообщений: 34
Я использую 2000 версию сервера, а в ней насколько я знаю отсутствуют данные выражения.
20 июн 11, 18:35    [10842725]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли обойтись без курсора?  [new]
Anddros
Member

Откуда:
Сообщений: 1077
rakyev
Я использую 2000 версию сервера, а в ней насколько я знаю отсутствуют данные выражения.
Наполнение времянки в цикле
20 июн 11, 18:40    [10842763]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли обойтись без курсора?  [new]
rakyev
Member

Откуда:
Сообщений: 34
Anddros
rakyev
Я использую 2000 версию сервера, а в ней насколько я знаю отсутствуют данные выражения.
Наполнение времянки в цикле


А без цикла никак нельзя обойтись? Придется использовать многовложенные курсоры, не хотелось бы к этому прибегать.
20 июн 11, 18:43    [10842791]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли обойтись без курсора?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
rakyev
Anddros
пропущено...
Наполнение времянки в цикле


А без цикла никак нельзя обойтись? Придется использовать многовложенные курсоры, не хотелось бы к этому прибегать.
Можно использовать просто несколько джойнов, если количество уровней невелико и ограничено.
20 июн 11, 19:04    [10842942]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли обойтись без курсора?  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
rakyev
Anddros
пропущено...
Наполнение времянки в цикле


А без цикла никак нельзя обойтись? Придется использовать многовложенные курсоры, не хотелось бы к этому прибегать.

можете исходить из того, что рекурсию можно переделать в цикл с собственной реализацией стека и больше ни во что.
20 июн 11, 19:07    [10842956]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли обойтись без курсора?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Бла-бла-бла.
DECLARE	@Group TABLE (
	 ID	Int IDENTUTY PRIMARY KEY
	,Parent	Int NULL	-- REFERENCES @Group(ID)
	,UNIQUE (	-- Index
		 Parent
		,ID
	)
);
INSERT	@Group	SELECT	NULL
UNION ALL	SELECT	1
UNION ALL	SELECT	1
UNION ALL	SELECT	1
UNION ALL	SELECT	2
UNION ALL	SELECT	2
UNION ALL	SELECT	4
UNION ALL	SELECT	5;
--------------------------------------------------------
DECLARE	@Parent	Int;
SET	@Parent	= 2;
DECLARE	@Result TABLE (
	 Level	SmallInt
	,ID	Int
	,PRIMARY KEY (	-- Index
		 Level
		,ID
	)
);
--------------------------------------------------------
DECLARE	@Level	SmallInt;
SET	@Level	= 0;
INSERT	@Result	(Level ID)
SELECT		@Level,ID
FROM	@Group
WHERE	ID = @Parent;

WHILE (@@RowCount > 0) BEGIN
	SET	@Level = @Level + 1;
	INSERT	@Result	(Level   ID)
	SELECT		@Level,C.ID
	FROM	     @Result	P
		JOIN @Group	C ON C.Parent = P.ID
	WHERE	P.Level = @Level - 1;
END

SELECT	G.*
FROM	     @Result	R
	JOIN @Group	G ON G.ID = R.ID
20 июн 11, 21:50    [10843453]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли обойтись без курсора?  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
неужели это цикл? )
21 июн 11, 11:11    [10845189]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли обойтись без курсора?  [new]
rakyev
Member

Откуда:
Сообщений: 34
Mnior, спасибо! Работает!)
21 июн 11, 11:46    [10845489]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли обойтись без курсора?  [new]
rakyev
Member

Откуда:
Сообщений: 34
Mnior, спасибо! Работает!)
21 июн 11, 11:47    [10845500]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить