문제

부모의 자녀 관계가있는 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은 루트 레벨 노드임을 의미합니다. 이제 부모 카테고리의 모든 수준에서 자식을 반환하는 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 데이터베이스 내에서 부모-자식 관계에 중첩 세트 모델을 사용해야합니다. 이와 같이 테이블에 레코드의 부모를 저장하는 것보다 훨씬 좋습니다.

그리고 그 자체의 부모가 작동하는지 확인하기 위해 (그렇지 않으면 부러 질 때까지 재발합니다) :

   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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top