아래와 같은 코드 목록을 가진 테이블에서 코드를 조합하여 만들어 낼 수 있는 모든 경우의 수에 대한 결과를 출력하는 쿼리 작성
| CODE |
| A |
| B |
| C |
문제 설명
- 코드 3개로 구할 수 있는 모든 경우의 수는 코드 1개 일때 조합, 2개일때 조합, 3개일때 조합 모두 구하기
- 코드의 개수는 정해져 있지 않음(가변적으로 늘어날 수 있음) 이때 2가지 방식의 경우에 정답 작성
- 순서와 무관한 경우의 수 : A-B/ B-A 같은 경우의 수로 취급하여 A-B 한개만 출력
- 순서가 있는 경우의 수 : A-B/ B-A 다른 경우의 수로 취급, 각각 조회되도록 작성
CREATE TABLE TEST AS
(
SELECT 'A' code FROM dual
UNION ALL SELECT 'B' FROM dual
UNION ALL SELECT 'C' FROM dual
);
SELECT code
FROM test;
<순서와 무관한 경우의 수 ->
--POSTGRE SQL
WITH RECURSIVE T2 AS (
SELECT 1 AS LV, CODE
FROM TEST T1
UNION ALL
SELECT LV+1, T1.CODE||'-'||T2.CODE
FROM TEST T1, T2
WHERE T1.CODE > T2.CODE
)
SELECT LV, REVERSE(CODE)
FROM T2
ORDER BY LV;
--ORACLE
SELECT SUBSTR(SYS_CONNECT_BY_PATH(code,'-'),2) code
FROM test
CONNECT BY PRIOR code < code
ORDER BY LEVEL, code
- REVERSE(문자열) : 함수 안의 문자열을 거꾸로 출력
- SYS_CONNECT_BY_PATH(칼럼(경로를 생성할 열 ), 구분자): 특정 레벨의 계층구조를 표현하는 모든 노드의 경로를 반환
<순서가 있는 경우의 수 >
--POSTGRESQL
WITH RECURSIVE T2 AS (
SELECT 1 AS LV, ARRAY[CODE] AS CODE
FROM TEST
UNION ALL
SELECT T2.LV + 1, T2.CODE || T1.CODE
FROM TEST T1, T2
WHERE t1.code NOT IN (SELECT unnest(T2.CODE))
)
SELECT LV, ARRAY_TO_STRING(CODE, '-') AS CODE
FROM T2
ORDER BY LV;
--ORACLE
SELECT SUBSTR(SYS_CONNECT_BY_PATH(code,'-'),2) code
FROM test
CONNECT BY NOCYCLE PRIOR code != code
ORDER BY LEVEL, code;
- UNSET(배열) : 함수 안의 배열을 행으로 반환 ex> {A, B, C} 배열의 아래와 같이 반환
| A |
| B |
| C |
- ARRAY_TO_STRING(문자열, 구분자) : 배열을 문자열로 바꾸고 각 요소 사이에 구분자 삽
ARRAY_TO_STRING({A, B, C},'-') -> 'A-B-C'
출처 : http://www.gurubee.net/lecture/2196
[퀴즈] 경우의 수 구하기
이번 퀴즈로 배워보는 SQL 시간에는 주어진 코드 리스트를 이용해 조합 가능한 모든 경우의 수를 구하는 쿼리를 어떻게 작성하는지에 대해 알아본..
www.gurubee.net
'DataBase > 구루비SQL Quiz' 카테고리의 다른 글
| [PostgreSQL]IP목록 정렬 (0) | 2023.09.21 |
|---|---|
| [PostgreSQL]연속된 날짜를 하나의 그룹으로 표현 (0) | 2023.09.21 |
| [PostgreSQL]분석함수 사용하지 않고 rank 쿼리 사용 (0) | 2023.08.28 |
| [Vertica]사원의 급여 합계 및 평균 (0) | 2023.08.28 |
| [PostgreSQL]스터디가입현황 (0) | 2023.08.24 |