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레벨까지 있고 이런식입니다.
글로 쓰려니까 설명이 좀 힘드네요. 고수님들의 도움 부탁드립니다. 감사합니다.
요구사항을 만족하는 쿼리는 단순합니다.
다만, 데이터가 계층 데이터가 아니라 정제가 필요해 보입니다.
계층형 데이터는 자식컬럼이 중복이 없어야 하는데 중복이 많네요.(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 ;