Можно ли обойтись без курсора?

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

Подскажите, можно ли начитать всю иерархию дочерних групп (GroupID) по переданной родительской группе (ParentGroupID) без использования курсора.
Ivan Durak
Дата: 20.06.2011 18:26:00
rakyev
Существует таблица Groups c полями:
GroupID (ID группы),
ParentGroupID (ID родительской группы) - ссылка на поле GroupID

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

CTE
invm
Дата: 20.06.2011 18:29:38
Не просто CTE, а рекурсивный CTE.
rakyev
Дата: 20.06.2011 18:35:56
Я использую 2000 версию сервера, а в ней насколько я знаю отсутствуют данные выражения.
Anddros
Дата: 20.06.2011 18:40:13
rakyev
Я использую 2000 версию сервера, а в ней насколько я знаю отсутствуют данные выражения.
Наполнение времянки в цикле
rakyev
Дата: 20.06.2011 18:43:33
Anddros
rakyev
Я использую 2000 версию сервера, а в ней насколько я знаю отсутствуют данные выражения.
Наполнение времянки в цикле


А без цикла никак нельзя обойтись? Придется использовать многовложенные курсоры, не хотелось бы к этому прибегать.
alexeyvg
Дата: 20.06.2011 19:04:54
rakyev
Anddros
пропущено...
Наполнение времянки в цикле


А без цикла никак нельзя обойтись? Придется использовать многовложенные курсоры, не хотелось бы к этому прибегать.
Можно использовать просто несколько джойнов, если количество уровней невелико и ограничено.
Зайцев Фёдор
Дата: 20.06.2011 19:07:52
rakyev
Anddros
пропущено...
Наполнение времянки в цикле


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

можете исходить из того, что рекурсию можно переделать в цикл с собственной реализацией стека и больше ни во что.
Mnior
Дата: 20.06.2011 21:50:05
Бла-бла-бла.
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
Зайцев Фёдор
Дата: 21.06.2011 11:11:09
неужели это цикл? )