ФК на том же столе - PullRequest
       1

ФК на том же столе

0 голосов
/ 05 октября 2010

У меня есть таблица с идентификатором PK, и у меня в том же столбце таблицы ParentID, который в некоторых случаях является идентификатором (в некоторых случаях я говорю, потому что, например, ParentID может быть 0, но этот идентификатор отсутствует в столбце идентификатора). Я пытаюсь создать Query:

ID     ParentID     Value
1      0            Test
2      0            Test01
3      2            Test02
4      3            Test03

И когда я отправляю ID = 4, мне нужен такой результат:

ID     ParentID     Value
2      0            Test01
3      2            Test02
4      3            Test03

Любая помощь ...

Ответы [ 3 ]

1 голос
/ 05 октября 2010

Это похоже на проблему обхода дерева, которая не особенно хорошо подходит для операций на основе множеств. Следующие работы, но это не слишком элегантно:

-- turn this into stored proc?
declare @inputId int
set @inputId = 4


declare @Ids table (ID int)
insert into @Ids values (@inputId)

declare @reccount int
set @reccount = 1
declare @lastreccount int
set @lastreccount = 0
while @reccount <> @lastreccount
begin
    set @lastreccount = @reccount
    insert into @Ids 
        select ParentID from recursiveTest 
            where ID in (select ID from @Ids)
                and ParentID not in (select ID from @Ids)
    set @reccount = (select COUNT(*) from @Ids)                      
end

select * from recursiveTest where ID in (select ID from @Ids);
1 голос
/ 05 октября 2010

Не используйте 0 (ноль), но null, чтобы сигнализировать "нет родителя".

0 голосов
/ 05 октября 2010

попробуйте это:

Declare @Id Integer Set @Id = 4
With Child(Id, ParentId, Value, Level) As
  ( Select Id, ParentId, Value, 0 as Level
    From table 
    Where id = @Id
    Union All
    Select t.Id, t.ParentId, t.Value, level + 1
    From Child c Join table t 
       On t.Id = c.ParentId
  )
Select id. ParentId, Value, Level
From Child
Order By Id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...