2010-10-05 4 views
0

J'ai une table avec ID qui est PK et j'ai dans la même colonne de table ParentID qui est dans certains cas ID (je dis certains cas car par exemple ParentID peut être 0 mais cet ID n'a pas dans la colonne ID). je tente de créer la requête:FK sur la même table

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

Et quand j'envoie ID = 4 J'ai besoin de ce résultat:

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

Toute aide ...

+1

Comment ID = 4 jamais vous donner votre ensemble de résultats d'échantillon? On dirait que vous envoyez l'ID <> 1 – Brad

+1

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

+1

@Brad, regarde comme il le veut pour remonter la hiérarchie de l'arbre jusqu'à la racine. (ou de la racine au noeud (4) qu'il demande) –

Répondre

1

Cela ressemble à un problème de traversal d'arbre pour moi, qui ne se prête pas particulièrement bien aux opérations sur la base-set. Les travaux suivants, mais il n'est pas trop élégant:

-- 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, travaille pour moi. – amchoni

1

Ne pas utiliser 0 (zéro) mais null pour signaler "pas de parent présent".

+0

je ne peux pas, c'est ce que j'ai et je peux changer cela! – amchoni

0

essayez ceci:

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

J'ai essayé cela, et je vois plus de lignes que je ne le pensais: –

+0

Désolé, vous devez recurse dans l'autre sens -> Modifié pour le corriger ... –

Questions connexes