2010-10-05 4 views
0

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

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 

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

+1

Как ID = 4 когда-либо дадут вам ваш образец результата? Похоже, вы отправляете идентификатор <> 1 – Brad

+1

см. Http://stackoverflow.com/questions/1757260/simplest-way-to-do-a-recursive-self-join-in-sql-server – Nix

+1

@Brad, выглядит как он хочет, чтобы он поднялся по иерархии дерева к корню. (или от корня до узла (4) он просит) –

ответ

1

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

-- 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); 
+0

Tnx, работает для меня. – amchoni

1

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

+0

Я не могу, это то, что у меня есть, и я могу это изменить! – amchoni

0

попробовать это:

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 
+0

Я пробовал это, и я вижу больше строк, чем я ожидал: –

+0

Прошу прощения, вам нужно вернуться в другое направление -> Отредактировано для исправления ... –

Смежные вопросы