SQL-Abfrage für Eltern Kind Beziehung
-
03-07-2019 - |
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
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