1-2단원 - 기존 계층적 데이터로 테이블 채우기Lesson 1-2 - Populating a Table with Existing Hierarchical Data

이 태스크에서는 새 테이블을 만들고 이를 EmployeeDemo 테이블의 데이터로 채웁니다.This task creates a new table and populates it with the data in the EmployeeDemo table. 이 태스크의 단계는 다음과 같습니다.This task has the following steps:

  • hierarchyid 열이 포함된 새 테이블을 만듭니다.Create a new table that contains a hierarchyid column. 이 열로 기존 EmployeeIDManagerID 열을 대체할 수도 있지만This column could replace the existing EmployeeID and ManagerID columns. 여기서는 해당 열을 유지합니다.However, you will retain those columns. 이는 기존 응용 프로그램에서 해당 열을 참조할 수 있으며 해당 열을 유지하는 것이 전송 후에 데이터를 이해하는 데 도움이 되기 때문입니다.This is because existing applications might refer to those columns, and also to help you understand the data after the transfer. 테이블 정의에서 OrgNode 를 기본 키로 지정하므로 해당 열에 고유 값을 포함해야 합니다.The table definition specifies that OrgNode is the primary key, which requires the column to contain unique values. OrgNode 열의 클러스터형 인덱스는 OrgNode 시퀀스의 날짜를 저장합니다.The clustered index on the OrgNode column will store the date in OrgNode sequence.

  • 각 관리자에게 직접 보고하는 직원 수를 추적하는 데 사용되는 임시 테이블을 만듭니다.Create a temporary table that is used to track how many employees report directly to each manager.

  • EmployeeDemo 테이블의 데이터를 사용하여 새 테이블을 채웁니다.Populate the new table by using data from the EmployeeDemo table.

NewOrg라는 새 테이블을 만들려면To create a new table named NewOrg

  • 쿼리 편집기 창에서 다음 코드를 실행하여 HumanResources.NewOrg라는 새 테이블을 만듭니다.In a Query Editor window, run the following code to create a new table named HumanResources.NewOrg:

    CREATE TABLE NewOrg  
    (  
      OrgNode hierarchyid,  
      EmployeeID int,  
      LoginID nvarchar(50),  
      ManagerID int  
    CONSTRAINT PK_NewOrg_OrgNode  
      PRIMARY KEY CLUSTERED (OrgNode)  
    );  
    GO  
    

#Children이라는 임시 테이블을 만들려면To create a temporary table named #Children

  1. 각 노드의 자식 수를 포함할 Num 열이 포함된 #Children 이라는 임시 테이블을 만듭니다.Create a temporary table named #Children with a column named Num that will contain the number of children for each node:

    CREATE TABLE #Children   
       (  
        EmployeeID int,  
        ManagerID int,  
        Num int  
    );  
    GO  
    
  2. NewOrg 테이블을 채우는 쿼리의 속도를 상당히 높일 인덱스를 추가합니다.Add an index that will significantly speed up the query that populates the NewOrg table:

    CREATE CLUSTERED INDEX tmpind ON #Children(ManagerID, EmployeeID);  
    GO  
    

NewOrg 테이블을 채우려면To populate the NewOrg table

  1. 재귀 쿼리는 집계가 있는 하위 쿼리를 금지합니다.Recursive queries forbid subqueries with aggregates. 대신 ROW_NUMBER() 메서드를 통해 Num 열을 채우는 다음 코드를 사용하여 #Children 테이블을 채웁니다.Instead, populate the #Children table with the following code, which uses the ROW_NUMBER() method to populate the Num column:

    INSERT #Children (EmployeeID, ManagerID, Num)  
    SELECT EmployeeID, ManagerID,  
      ROW_NUMBER() OVER (PARTITION BY ManagerID ORDER BY ManagerID)   
    FROM EmployeeDemo  
    GO  
    
  2. #Children 테이블을 검토합니다.Review the #Children table. Num 열에 각 관리자에 대한 일련 번호가 포함되는 방식을 확인합니다.Note how the Num column contains sequential numbers for each manager.

    SELECT * FROM #Children ORDER BY ManagerID, Num  
    GO  
    

    결과 집합은 다음과 같습니다.Here is the result set.

    EmployeeID ManagerID Num

    ---------- --------- ---

    1 NULL 1

    2 1 1

    3 1 2

    4 2 1

    5 2 2

    6 2 3

    7 3 1

    8 3 2

    9 4 1

    10 4 2

  3. NewOrg 테이블을 채웁니다.Populate the NewOrg table. GetRoot 및 ToString 메서드를 사용하여 Num 값을 hierarchyid 형식에 연결한 다음 OrgNode 열을 결과 계층 값으로 업데이트합니다.Use the GetRoot and ToString methods to concatenate the Num values into the hierarchyid format, and then update the OrgNode column with the resultant hierarchical values:

    WITH paths(path, EmployeeID)   
    AS (  
    -- This section provides the value for the root of the hierarchy  
    SELECT hierarchyid::GetRoot() AS OrgNode, EmployeeID   
    FROM #Children AS C   
    WHERE ManagerID IS NULL   
    
    UNION ALL   
    -- This section provides values for all nodes except the root  
    SELECT   
    CAST(p.path.ToString() + CAST(C.Num AS varchar(30)) + '/' AS hierarchyid),   
    C.EmployeeID  
    FROM #Children AS C   
    JOIN paths AS p   
       ON C.ManagerID = P.EmployeeID   
    )  
    INSERT NewOrg (OrgNode, O.EmployeeID, O.LoginID, O.ManagerID)  
    SELECT P.path, O.EmployeeID, O.LoginID, O.ManagerID  
    FROM EmployeeDemo AS O   
    JOIN Paths AS P   
       ON O.EmployeeID = P.EmployeeID  
    GO  
    
  4. hierarchyid 열을 문자 형식으로 변환하면 이해하기가 더 쉬워집니다.A hierarchyid column is more understandable when you convert it to character format. OrgNode 열의 두 가지 표현이 포함된 다음 코드를 실행하여 NewOrg 테이블의 데이터를 검토합니다.Review the data in the NewOrg table by executing the following code, which contains two representations of the OrgNode column:

    SELECT OrgNode.ToString() AS LogicalNode, *   
    FROM NewOrg   
    ORDER BY LogicalNode;  
    GO  
    

    LogicalNode 열은 계층을 나타내는 보다 읽기 쉬운 텍스트 형식으로 hierarchyid 열을 변환합니다.The LogicalNode column converts the hierarchyid column into a more readable text form that represents the hierarchy. 나머지 태스크에서는 ToString() 메서드를 사용하여 hierarchyid 열의 논리 형식을 표시합니다.In the remaining tasks, you will use the ToString() method to show the logical format of the hierarchyid columns.

  5. 더 이상 필요하지 않은 임시 테이블을 삭제합니다.Drop the temporary table, which is no longer needed:

    DROP TABLE #Children  
    GO  
    

다음 태스크에서는 계층 구조를 지원하는 인덱스를 만듭니다.The next task will create indexes to support the hierarchical structure.

단원의 다음 태스크Next Task in Lesson

NewOrg 테이블 최적화Optimizing the NewOrg Table