DataBase/구루비SQL Quiz

[Oracle] 경우의 수 구하기

cororo2 2024. 4. 16. 22:24

아래와 같은 코드 목록을 가진 테이블에서 코드를 조합하여 만들어 낼 수 있는 모든 경우의 수에 대한 결과를 출력하는 쿼리 작성

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