복붙노트

[SQL] 부모 자식 관계에 대한 SQL 쿼리

SQL

부모 자식 관계에 대한 SQL 쿼리

나는 부모 자식 관계 등으로 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 쿼리를 작성합니다.

예를 들면 노드 아이디 = 1의 경우, 3, 4, 5, 6을 반환한다.

나는 2005 MS SQL 서버를 사용하고 있습니다

해결법

  1. ==============================

    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]
    
  2. ==============================

    2.당신은 SQL 데이터베이스 내에서 부모 - 자식 관계의 중첩 된 세트 모델을 사용하여 조사한다. 그것은이 같은 테이블에 레코드의 parentID를 저장하는 것보다 훨씬 좋네요, 그리고이 같은 쿼리가 훨씬 쉬워집니다.

    당신은 SQL 데이터베이스 내에서 부모 - 자식 관계의 중첩 된 세트 모델을 사용하여 조사한다. 그것은이 같은 테이블에 레코드의 parentID를 저장하는 것보다 훨씬 좋네요, 그리고이 같은 쿼리가 훨씬 쉬워집니다.

  3. ==============================

    3.그리고 단지 자체의 자사의 부모가 (이 중단 될 때까지 그렇지 않으면 재귀) 경우 확인이 작동하는지 확인합니다 :

    그리고 단지 자체의 자사의 부모가 (이 중단 될 때까지 그렇지 않으면 재귀) 경우 확인이 작동하는지 확인합니다 :

       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. ==============================

    4.

     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
    
  5. from https://stackoverflow.com/questions/207309/sql-query-for-parent-child-relationship by cc-by-sa and MIT license