SQL: HTML Table COLSPAN 구현을 위한 계층형 쿼리(CTE) 예시


동적 HTML 테이블에서 셀 합치기(colspan / rowspan)를 구현할 때, 그룹 계층 구조 및 레벨별 데이터를 추출하기 위한 계층형 재귀 쿼리(WITH 절) 예시 소스입니다.

 

1. 그룹 계층 구조 조회 쿼리

특정 컴포넌트 번호들을 대상으로 그룹 레벨 및 순서를 재귀적으로 상위 추적하여 가져옵니다.

WITH cme(comp_no, comp_group_no, comp_group_name, comp_group_level_ref, level, display_order) AS (
    SELECT cmp.ti_cathode_comp_no, 
           cmpg.ti_cathode_comp_group_no, 
           cmpg.ti_cathode_comp_group_name, 
           cmpg.ti_cathode_comp_group_level_ref, 
           1 AS level, 
           cmpg.display_order 
      FROM ti_cathode_comp cmp, ti_cathode_comp_group cmpg 
     WHERE cmp.ti_cathode_comp_no IN (
           '34033000006', '34033000002', '34033000003', '34033000004', 
           '34033000005', '34033000001', '34033000007', '34033000008', 
           '34033000009', '34033000010', '34033000011', '34033000012', 
           '34033000013', '34033000014'
     ) 
       AND cmp.ti_cathode_comp_group_no = cmpg.ti_cathode_comp_group_no
    
    UNION ALL
    
    SELECT cme.comp_no, 
           cmpg.ti_cathode_comp_group_no, 
           cmpg.ti_cathode_comp_group_name, 
           cmpg.ti_cathode_comp_group_level_ref, 
           cme.level + 1, 
           cmpg.display_order 
      FROM cme, ti_cathode_comp_group cmpg
     WHERE cmpg.ti_cathode_comp_group_no = cme.comp_group_level_ref
)
SELECT *
  FROM cme
 ORDER BY level DESC, comp_group_no ASC;

-- 그룹별/레벨별 카운트 조회 시
-- SELECT comp_group_name, level, COUNT(*)
--   FROM cme 
--  GROUP BY comp_group_name, level;

 

2. 아이템 그룹 계층 조회 쿼리

아이템 목록의 그룹 레벨을 단계별로 확장하여 HTML 테이블 표출 시 병합 범위를 계산할 때 활용합니다.

WITH tle(lot_item_no, lot_item_group_no, lot_item_group_name, lot_item_group_level_ref, level, display_order) AS (
    SELECT tl.lot_item_no, 
           tlg.lot_item_group_no, 
           tlg.lot_item_group_name, 
           tlg.lot_item_group_level_ref, 
           1 AS level, 
           tlg.display_order
      FROM towpreg_lot_item tl, towpreg_lot_item_group tlg
     WHERE tl.lot_item_no IN (SELECT lot_item_no FROM towpreg_lot_item)
       AND tl.lot_item_group_no = tlg.lot_item_group_no
    
    UNION ALL
    
    SELECT tle.lot_item_no, 
           tlg.lot_item_group_no, 
           tlg.lot_item_group_name, 
           tlg.lot_item_group_level_ref, 
           tle.level + 1, 
           tlg.display_order
      FROM tle, towpreg_lot_item_group tlg
     WHERE tlg.lot_item_group_no = tle.lot_item_group_level_ref
)
SELECT *
  FROM tle
 ORDER BY level DESC, lot_item_group_no ASC;

-- 그룹별/레벨별 카운트 조회 시
-- SELECT lot_item_group_no, level, COUNT(*)
--   FROM tle
--  GROUP BY lot_item_group_no, level;

 

3. 핵심 정리

  • WITH 절(CTE) 활용: 자기 자신을 참조하는 UNION ALL 구조를 사용하여 다단계 트리 구조 데이터의 깊이(level)를 계산합니다.
  • HTML 병합 연동: 추출된 level 및 display_order 값을 기반으로 화면단에서 colspan 또는 rowspan 개수를 동적으로 렌더링할 때 유용합니다.