SQL 재귀 WITH 절에서 nPr(n = r)의 한 자리 숫자 순열을 생성해 봅니다. (Oracle Database)

4220 단어 오라클SQL

1. 하고 싶은 일



표제대로, 재귀 WITH구로 아래와 같은 수치의 순열(중복 없음)을 생성해 보겠습니다.
1       ... 1
1, 2    ... 12, 21
1, 2, 3 ... 123, 132, 213, 231, 312, 321
:

nPr 의 공식으로 n = r 의 순열이 됩니다. 사용하는 것은 Oracle Database입니다.
약간의 검증이었기 때문에 Live SQL 사이트에서 가챠 가챠와 검증 彡 (゚)(゚)

Oracle Live SQL
htps : // ゃゔぇsql. 오 c. 코m/

2. 순열을 생성하는 SQL



다음과 같은 SQL에서 대상 순열을 생성할 수 있었습니다. 수치 1 자리수까지 대응합니다.
WITH nums AS (
  SELECT LEVEL AS C0
    FROM DUAL
 CONNECT BY LEVEL <= 3
),
cte(c1, c2) AS (
  SELECT nums.c0, TO_CHAR(nums.c0)
    FROM nums
   UNION ALL
  SELECT c1
       , c2 || nums.c0
    FROM nums, cte
   WHERE LENGTH(c2) < 3
     AND cte.c2 NOT LIKE '%' || TO_CHAR(nums.c0) || '%'
)
SELECT *
  FROM cte
 WHERE LENGTH(c2) = 3
 ORDER BY c2;

결과는 다음과 같다. n = r 의 순열의 경우는 n!(계승) 로 요소수를 표현할 수 있습니다. 3 의 경우는 3*2*1 로 6개



1,2,3,4,5 의 순열에서는 다음과 같이 됩니다. 요소수는 5!=5*4*3*2*1 로 120개군요.



3. SQL 해설



다음과 같은 생각으로 SQL을 짜고 있습니다.

・처음의 WITH구(nums 가표)로 순열의 생성에 필요한 수치(1, 2, 3, ...)를 생성하고 있습니다.
· 재귀 WITH 절의 시작 조건 (시작 레코드)은 nums 가표의 각 요소
· 재귀 WITH 절의 계속 조건은 길이가 요구하는 순열의 길이보다 작은 경우 또한 nums 가표의 요소를 순열 (c2 열)에 포함하지 않는 경우
・그대로라면 짧은 순열도 취득되어 버리므로, 순열의 문자열 길이로 좁혀지고 있습니다.

위와 같이 재귀 WITH구의 계속 조건의 판정이 쇼보이므로, 1자리수의 수치까지 밖에 대응하지 않습니다.

4. 참고 사이트



아래의 사이트를 참고로 했습니다. 감사합니다!彡(^)(^)

SQL만으로 재귀적으로 순열/조합을 열거한다
htps : // 천. 에서 v

위 사이트와 같이 배열형을 정의하고 괴롭히면 1자리수 제한도 돌파할 수 있다고 생각된다.
彡(゚)(゚)

좋은 웹페이지 즐겨찾기