오라클 계층형 쿼리에서 하위 레벨 모두 뽑기 0 1 3,272

by 트집이 [Oracle 기초] oracle plsql 계층형 쿼리 [2023.05.16 18:41:52]


WITH T AS (				
	SELECT   1 unique_id, 'A' PARENT,'B' CHILD, 1 LVL, 'test' test FROM DUAL
	UNION ALL
	SELECT   2, 'B' PARENT,'C' CHILD, 2, NULL   FROM DUAL
	UNION ALL
	SELECT   3, 'B' PARENT,'E' CHILD, 2, null FROM DUAL
	UNION ALL
	SELECT   4, 'C' PARENT,'D' CHILD, 3, 'test' FROM DUAL
	UNION ALL
	SELECT   5, 'C' PARENT,'D' CHILD, 3, null FROM DUAL
	UNION ALL
	SELECT   6, 'C' PARENT,'D' CHILD, 3, 'test' FROM DUAL
	UNION ALL
	SELECT   7, 'D' PARENT,'G' CHILD, 4, 'test' FROM DUAL
		UNION ALL
	SELECT   8, 'G' PARENT,'H' CHILD, 5, 'test' FROM DUAL
)
SELECT * FROM T;

위와 같은 테이블이 있다고 가정하겠습니다.

데이터의 구조만 봐 주세요. 실제 데이터 값은 무시하셔도 됩니다.

1. 특정 조건을 만족하는 데이터를 구합니다.

예를 들면 test 컬럼의 값이 NULL인 데이터만 가져온다.

2. 위 1번에서 뽑은 데이터를 기준으로 하위 레벨의 모든 데이터를 가져온다.

이때 하위 레벨은 CHILD가 "D"인 값의 하위 레벨은 "D"의 레벨이 3레벨이므로 4레벨, 5레벨 모두 뽑아야합니다.

바로 아래의 레벨뿐만 아니라 그 아래까지도 뽑아야 합니다. (이거를 잘 모르겠어요. ㅜㅜ)

 

위 예시로 test가 null인 값의 하위 레벨을 모두 뽑으면

unique_id가 4,5,6,7,8이 될 것 같아요.

 

참고로 레벨은 데이터마다 고정으로 끝나는게 아니고 어떤 데이터는 5레벨까지 있고 어떤 데이터는 7레벨까지 있고 이런식입니다.

글로 쓰려니까 설명이 좀 힘드네요. 고수님들의 도움 부탁드립니다. 감사합니다.

 

 

by 마농 [2023.05.16 19:58:31]

요구사항을 만족하는 쿼리는 단순합니다.
다만, 데이터가 계층 데이터가 아니라 정제가 필요해 보입니다.
계층형 데이터는 자식컬럼이 중복이 없어야 하는데 중복이 많네요.(D 3건 중복)
"실제 데이터 값은 무시하셔도 됩니다."라고 하셨지만. 무시할 수 있는 상황이 아닙니다.
데이터가 이렇게 들어 있다면 계층 쿼리를 사용할 수 없습니다.
아래는 억지로 사용한 쿼리입니다. DISTINCT 를 억지로 사용할 수 밖에 없는 상황.

WITH t AS
(             
SELECT 1 unique_id, 'A' parent, 'B' child, 1 lvl, 'test' test FROM dual
UNION ALL SELECT 2, 'B', 'C', 2,  NULL  FROM dual
UNION ALL SELECT 3, 'B', 'E', 2,  null  FROM dual
UNION ALL SELECT 4, 'C', 'D', 3, 'test' FROM dual
UNION ALL SELECT 5, 'C', 'D', 3,  null  FROM dual
UNION ALL SELECT 6, 'C', 'D', 3, 'test' FROM dual
UNION ALL SELECT 7, 'D', 'G', 4, 'test' FROM dual
UNION ALL SELECT 8, 'G', 'H', 5, 'test' FROM dual
)
SELECT DISTINCT *
  FROM t
 WHERE LEVEL != 1
 START WITH test IS NULL
 CONNECT BY PRIOR child = parent
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입