Frage

Ich habe DB-Tabelle mit Eltern-Kind-Beziehung, wie:

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

Hier parentId = 0 bedeutet, dass es ein Root-Ebene-Knoten ist. Jetzt möchte ich eine SQL-Abfrage schreiben, das Kind auf allen Ebenen einer übergeordneten Kategorie zurückkehren wird.

z. für nodeId = 1, sollte es zurückkehren 3, 4, 5, 6.

Ich bin mit MS SQL Server 2005

War es hilfreich?

Lösung

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]

Andere Tipps

Sie sollten schauen Sie in die Nested Sets für die Verwendung von Eltern-Kind-Beziehungen in einer SQL-Datenbank. Es ist viel schöner, als zu versuchen, die parentID der Datensätze in der Tabelle wie folgt zu speichern und macht Anfragen wie diese viel einfacher.

Und nur um sicherzustellen, dass es, wenn seine Eltern von selbst funktioniert (sonst wird es Rekursion, bis er bricht):

   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]
 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top