계층형 데이터 조회하기
일반적으로 화면에 필요한 데이터는 행(Row)과 열(Column)로 구성된 표 형태의 2차원 데이터로 정형화 되어있습니다.
이러한 형태의 데이터는 엑셀에서 흔히 볼 수 있으며, 단일 서식 데이터, 테이블, 그리드, AI 학습 데이터로 자주 사용됩니다.
관계형 데이터베이스의 SQL 결과는 기본적으로 이러한 구조를 가지고 있기 때문에 쿼리를 적절하게 만들면 됩니다.
하지만 메뉴, 조직도, 차트와 같이 계층형 (Nested) 형식의 데이터 구조를 필요로 할 때가 있습니다. JSON으로 데이터 표현하면 다음고 같은 구조를 가집니다.
[{
"MenuID": "CFG",
"MenuName": "환경설정",
"ParentMenuID": "000",
"ParentMenuName": "HandStack",
"ShowYN": "Y",
"MenuType": "D",
"_Children": [
{
"MenuName": "프로그램",
"ParentMenuID": "CFG",
"ParentMenuName": "환경설정",
"ShowYN": "Y",
"MenuType": "D",
"_Children": null
},
{
"MenuName": "배포",
"ParentMenuID": "CFG",
"ParentMenuName": "환경설정",
"ShowYN": "Y",
"MenuType": "D",
"_Children": null
}
]
}]
HandStack에서는 이러한 데이터의 구조를 SQL 만으로 구성 가능한 기능을 제공합니다. 다음은 wwwroot, transact, dbclient 모듈내의 주요 코드를 설명합니다.
dbclient SQL 쿼리
데이터베이스는 SqlServer 쿼리를 사용합니다. 다른 데이터베이스의 경우 계층형 쿼리를 조금 수정할 필요가 있습니다.
<statement id="LD10" seq="0" use="Y" timeout="0" desc="계층형 목록 테스트 조회" modified="2023-08-31 00:00:00">
<![CDATA[
SELECT
ME.EntityNo
, ME.ApplicationNo
, ME.EntityID
, ME.EntityName
, ME.Acronyms
, ME.SeedData
FROM
MetaEntity ME;
SELECT
MF.EntityNo
, MF.FieldID
, MF.FieldName
, MF.FieldType
, MF.PK
, MF.IX
, MF.UI
, MF.NN
, MF.AI
, MF.MaxLength
, MF.DefaultValue
, MF.Comment
, MF.SortingNo
FROM
MetaField MF;
WITH MenuHierarchy AS (
SELECT MenuID
, MenuName
, ParentMenuID
, ParentMenuName
, ShowYN
, MenuType
FROM Menu
WHERE ParentMenuID IS NULL
UNION ALL
SELECT M.MenuID
, M.MenuName
, M.ParentMenuID
, M.ParentMenuName
, M.ShowYN
, M.MenuType
FROM Menu M
INNER JOIN MenuHierarchy MH ON M.ParentMenuID = MH.MenuID
)
SELECT * FROM MenuHierarchy;
]]>
</statement>