views:

5490

answers:

4

I have db table with parent child relationship as:

NodeId    NodeName    ParentId
------------------------------
1         Node1       0
2         Node2       0
3         Node3       1
4         Node4       1
5         Node5       3
6         Node6       5
7         Node7       2

Here parentId = 0 means that it is a root level node. Now I want to write an SQL Query which will return child at all level of a parent category.

e.g. for nodeId = 1, it should return 3, 4, 5, 6.

I am using MS SQL Server 2005

A: 

I answered a similar question Hierarchical data in LINQ options and performance here.

tvanfosson
+1  A: 
with [CTE] as (
    select * from [TheTable] c where c.[ParentId] = 1
    union all
    select * from [CTE] p, [TheTable] c where c.[ParentId] = p.[NodeId]
)
select * from [CTE]
Justice
I suggest adding the maximum recursion hint.
Pittsburgh DBA
+2  A: 

You should look into using the Nested Set Model for parent-child relationships within an SQL database. It's much nicer than trying to store the parentID of records in the table like this, and makes queries like this much easier.

Keith Palmer
+2  A: 

And just to make sure it works if its a parent of itself (otherwise it will recurse until it breaks):

   with [CTE] as (
        select * from [TheTable] c where c.[ParentId] = 1
        union all
        select * from [CTE] p, [TheTable] c where c.[ParentId] = p.[NodeId]
        and c.[ParentId] <> c.[NodeId]
    )
    select * from [CTE]
Coolcoder