Ответ 1
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]
У меня есть таблица db с родительским дочерним отношением как:
NodeId NodeName ParentId
------------------------------
1 Node1 0
2 Node2 0
3 Node3 1
4 Node4 1
5 Node5 3
6 Node6 5
7 Node7 2
Здесь parentId = 0 означает, что он является корневым уровнем node. Теперь я хочу написать SQL-запрос, который будет возвращать дочерний элемент на любом уровне родительской категории.
например. для nodeId = 1, он должен возвращать 3, 4, 5, 6.
Я использую MS SQL Server 2005
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]
Вы должны изучить использование модели вложенного набора для отношений родитель-потомок в базе данных SQL. Это гораздо приятнее, чем пытаться сохранить parentID записей в таблице, как это, и делает запросы намного проще.
И только для того, чтобы убедиться, что он работает, если его родитель сам по себе (иначе он будет регенерировать, пока он не сломается):
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