Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Прохождение дерева в T-SQL


Автор: Idsa 5.5.2008, 10:55
Здравствуйте!
Мне необходимо написать хранимую процедуру для прохождения дерева вверха. Структура таблицы примерно следующая: id, parentId. Необходимо, получив на вход id, вернуть массив всех его parentId (пробежать дерево вверх). Нашел тему с обратной задачей: http://forum.vingrad.ru/topic-173067.html. Но т. к. T-SQL знаю весьма посредственно, хотелось бы получить рекомендации конкретно по моему вопросу.
Буду рад любой помощи.
P. S. А можно ли реализовать прохождение дерева вверх без хранимой процедуры?

Автор: Magnifico 5.5.2008, 14:38
правда я не сталкивался с надобностью делать такие процедуры
но ввиду интересности вопроса:
вот статья как поднятся вверх с примером процедуры для Firebird
http://www.ibase.ru/devinfo/treedb.htm
я ее просто переделал:

Код

CREATE TABLE OBJECTS( 
  ID INTEGER NOT NULL, 
  PARENT INTEGER NOT NULL, 
  NAME VARCHAR(30),
  constraint PK_OBJECTS primary key (ID)) 
--------------------------------------
insert into objects
select 1    ,0    ,'Родитель1' union all
select 2,    1,    'Потомок1' union all
select 3,    1    ,'Потомок2' union all
select 4    ,2    ,'Потомок3'
--------------------------------------


Код

alter procedure GETPARENTS
@ID INTEGER
as
declare @DID INTEGER, @OID INTEGER, @NAME VARCHAR(30)
declare @Temp table( 
 ID INTEGER NOT NULL, 
 PARENT INTEGER NOT NULL, 
 [NAME] VARCHAR(30)
)
--------------------------------
begin
WHILE (@ID > 0)  /* ищем до корня */
    BEGIN 
      SELECT @DID= O.ID, @OID= O.PARENT, @NAME =O.[NAME] 
      FROM OBJECTS O 
      WHERE O.ID = @ID 
     ------------------------------------
     Insert  @temp select @DID, @OID, @NAME; 
     set @ID = @OID /* код родителя для следующей выборки */
      
    END 
 select * from @temp
end


вызываем : 
Код

exec GETPARENTS 4

Автор: Idsa 5.5.2008, 21:06
Magnifico, спасибо за помощь. Именно то, что нужно smile +1

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)