Zapytanie SQL dla relacji rodzic-dziecko

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

Tutaj parentId = 0 oznacza, że jest to węzeł poziomu głównego. Teraz chcę napisać zapytanie SQL, które zwróci dziecko na wszystkich poziomach kategorii nadrzędnej.

Np. dla nodeId = 1, powinien zwrócić 3, 4, 5, 6.

Używam MS SQL Server 2005

Author: Smandoli, 2008-10-16

4 answers

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]
 10
Author: yfeldblum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-16 03:17:39

Powinieneś rozważyć użycie zagnieżdżonego modelu zestawu dla relacji rodzic-dziecko w bazie danych SQL. Jest to o wiele ładniejsze niż próba przechowywania parentID rekordów w tabeli w ten sposób, i sprawia, że zapytania takie jak to znacznie łatwiejsze.

 6
Author: Keith Palmer Jr.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-17 13:56:32

I tylko, aby upewnić się, że działa, jeśli jego rodzic sam w sobie (w przeciwnym razie będzie rekurencyjnie dopóki się nie złamie):

   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]
 4
Author: Coolcoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-06 06:45:19
 WITH Temp_Menu AS
 ( 
  SELECT AM.* from FCB_AccessMenu AM where AM.[ParentId] = 6   

           UNION ALL     

        SELECT AM.* FROM  FCB_AccessMenu AM ,Temp_Menu TM  WHERE AM.[ParentID]=TM.[MenuID]        

  )   

  SELECT * FROM Temp_Menu ORDER BY ParentID
 1
Author: Raju,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-02 12:25:54