본문 바로가기

MS-SQL

MSSQL 특정노드의 상위노드 전체 가져오기(Bottom Up)

조직도에서 상위조직 모두 가져오기

지난글에서는 조직도 데이터에서 특정노드의 하위데이터 전체를 가져오는 함수를 만들어봤습니다. 이번글 에서는 Top Down함수의 반대되는 개념으로 "특정노드의 상위노드 전체 가져오기(Bottom Up)함수"를 작성해 보겠습니다. 

사용될 테이블 및 데이터는 지난 특정노드의 하위노드 전체 가져오기(Top Down) 글을 참고하시기 바랍니다.


테이블 반환 사용자 정의 함수 만들기

여기서는 조직코드를 파라메터로 넘기면 그 조직을 포함한 하위조직 전부를 반환하는 테이블 함수입니다.

Bottom Up함수도 Top Down과 유사하게 WITH CTE(Common Table Expression)의 재귀공통 테이블식을 사용하여 구현할 수 있습니다.

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- 특정조직의 하위조직 찾아오기
CREATE FUNCTION [dbo].[GetBottomUp](@DeptCd varchar(5))

RETURNS @rTable TABLE (
        [DeptCd] nvarchar(5),
        [DeptName] nvarchar(50),
        [ParentDeptCd] nvarchar(5),
        [depth] [int] NOT NULL
) 

AS
BEGIN
    WITH OrgTree(DeptCd, DeptName, ParentDeptCd, Depth) AS (   
        SELECT DeptCd, DeptName, ParentDeptCd, 0 AS Depth
        FROM Company
        WHERE DeptCd = @DeptCd

        UNION ALL

        SELECT COM.DeptCd, COM.DeptName, COM.ParentDeptCd, ORG.Depth + 1
        FROM Company AS COM 
	INNER JOIN OrgTree AS ORG 
	    ON COM.DeptCd = ORG.ParentDeptCd
    )       
    INSERT @rTable
    SELECT DeptCd, DeptName, ParentDeptCd, Depth
FROM OrgTree OPTION (MAXRECURSION 100); RETURN END

결과조회

위의 Bottom Up함수를 이용해 다음과 같이 특정조직의 모든 상위 조직을 가져올 수 있습니다.

--상황1. 인사팀 상위 조직 모두 가져오기
SELECT * FROM dbo.GetBottomUp('11220')

--상황2. 경영지원본부 상위 조직 모두 가져오기
SELECT * FROM dbo.GetBottomUp('11000')

쿼리결과1

사성전자 인사팀 상위조직 모두 가져오기(Bottom Up) 함수 실행 결과


쿼리결과2

사성전자 경영지원본부 상위조직 모두 가져오기(Bottom Up) 함수 실행 결과


프로젝트의 성공을 기원합니다.