문제 링크: http://www.gurubee.net/lecture/2196
(내 댓글 참고)
[내가 생각한 방법들]
1. 구글링 결과 WM_CONCAT을 알게 돼서 써봄.. - 결과 터무니없음
WITH TEST AS
(
SELECT 'A' code FROM dual
UNION ALL SELECT 'B' FROM dual
UNION ALL SELECT 'C' FROM dual
)
SELECT WM_CONCAT(T.CODE)
FROM TEST T
WHERE 1 = 1
--AND T.CODE IN ('B', 'A')
;
2. 최근에 알게 된 LEAD, LAG 함수에 꽂혀서 노가다 방식을 생각해봄. - 결과는 터무니없음
SELECT T.CODE
FROM TEST T
UNION ALL
SELECT T.CODE || ',' || LEAD(T.CODE) OVER (ORDER BY T.CODE)
FROM TEST T
UNION ALL
SELECT T.CODE || ',' || LEAD(T.CODE) OVER (ORDER BY T.CODE) || ',' || LEAD(T.CODE) OVER (ORDER BY T.CODE)
FROM TEST T
;
3. 셀프 조인을 해 봄 -> AA BB CC와 같은 값을 어떻게 없애야 하는지 생각을 더 안 함...
부등호 조인 배웠는데!!! 너무 아깝
SELECT *
FROM TEST T1, TEST T2
WHERE 1 = 1
;
[해설 보고 완성한 쿼리들]
-
결과 테이블 1 답(하수 VER.) -> CROSS JOIN 이용
-> 셀프 조인과, 부등호 조인 보고 바로 도출한 쿼리
WITH TEST AS
(
SELECT 'A' code FROM dual
UNION ALL SELECT 'B' FROM dual
UNION ALL SELECT 'C' FROM dual
)
SELECT *
FROM TEST T1
UNION ALL
SELECT T1.CODE || ',' || T2.CODE CODE
FROM TEST T1, TEST T2
WHERE 1 = 1
AND T1.CODE < T2.CODE
UNION ALL
SELECT WM_CONCAT(T.CODE)
FROM TEST T
;
-
결과 테이블 1 답 (고수 VER.) -> 계층구조 쿼리 이용
-> TEST 테이블에는 부모 - 자식 칼럼이 따로 주어져있지 않지만, 우리가 정해서 SYS_CONNECT_BY_PATH를 이용해먹으면 됨
-> AB/AC/BC/ABC를 부모-자식 관계라고 생각해서 [부모 코드가 자식 코드보다 작다는 공통 조건을] 주면 됨!
(이 조건은 이미 Cross Join 방법에서도 이미 사용되었던 조건)
WITH TEST AS
(
SELECT 'A' code FROM dual
UNION ALL SELECT 'B' FROM dual
UNION ALL SELECT 'C' FROM dual
)
SELECT CODE
, LEVEL
, SYS_CONNECT_BY_PATH(CODE, '-') PATH
FROM TEST
CONNECT BY PRIOR CODE < CODE
;
-
결과 테이블 2 답
나는 CONNECT BY 조건을 <= 로 생각함 (실패)
결과 테이블 2는 순서까지 고려한 것이므로 [부모 코드가 자식 코드와 다르면] 연결 조건이 성립됨.
WITH TEST AS
(
SELECT 'A' code FROM dual
UNION ALL SELECT 'B' FROM dual
UNION ALL SELECT 'C' FROM dual
)
SELECT CODE
, LEVEL
, SYS_CONNECT_BY_PATH(CODE, '-') PATH
FROM TEST
CONNECT BY NOCYCLE PRIOR CODE != CODE
;
'계층 구조 쿼리' 이해를 위한 간단한 예제
WITH test AS
(
SELECT 'A' 코드, '' 부모코드 FROM dual
UNION ALL SELECT 'B', 'A' FROM dual
UNION ALL SELECT 'C', 'B' FROM dual
)
SELECT 코드
, 부모코드
, LEVEL
, SYS_CONNECT_BY_PATH(코드, '-') 계층경로
FROM TEST
START WITH 부모코드 IS NULL
CONNECT BY PRIOR 코드=부모코드
;
LEVEL (계층의 DEPTH를 알려줌)
LEVEL을 쓰기 위해선 CONNECT BY를 같이 써야 하고, 이는 JOIN 조건(계층구조 쿼리 VER)이라고 생각하면 됨
PRIOR는 상위 노드의 값을 참조하겠다는 의미.
START WITH에 계층구조의 시작 조건을 기술해줌.
'DATABASE > ORACLE' 카테고리의 다른 글
[ORACLE SQL 문제] 목록과 함께 평균 구하기 - GROUPING, GROUPING_ID, PIVOT. ROLLUP 결과 행 조건 걸기 (0) | 2020.03.12 |
---|---|
[ORACLE SQL 문제] 날짜별 모든 코드(빠진 데이터 없이)에 대한 자료 채우기 (0) | 2020.03.04 |
[ORACLE SQL 문제] 일별 누적 접속자 통계 구하기 (0) | 2020.03.03 |
[ORACLE SQL 문제] 여러 테이블 혼합해서 결과 표 도출하기 (0) | 2020.03.03 |
[ORACLE SQL 문제] 연속된 숫자만 그룹핑하기 (0) | 2020.03.03 |
Comments