SQL 재귀 WITH 절에서 nPr(n = r)의 한 자리 숫자 순열을 생성해 봅니다. (Oracle Database)
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자리수 제한도 돌파할 수 있다고 생각된다.
彡(゚)(゚)
Reference
이 문제에 관하여(SQL 재귀 WITH 절에서 nPr(n = r)의 한 자리 숫자 순열을 생성해 봅니다. (Oracle Database)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ora_gonsuke777/items/36dd471d2d7299d7fab8
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
1 ... 1
1, 2 ... 12, 21
1, 2, 3 ... 123, 132, 213, 231, 312, 321
:
다음과 같은 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자리수 제한도 돌파할 수 있다고 생각된다.
彡(゚)(゚)
Reference
이 문제에 관하여(SQL 재귀 WITH 절에서 nPr(n = r)의 한 자리 숫자 순열을 생성해 봅니다. (Oracle Database)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ora_gonsuke777/items/36dd471d2d7299d7fab8
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
아래의 사이트를 참고로 했습니다. 감사합니다!彡(^)(^)
SQL만으로 재귀적으로 순열/조합을 열거한다
htps : // 천. 에서 v
위 사이트와 같이 배열형을 정의하고 괴롭히면 1자리수 제한도 돌파할 수 있다고 생각된다.
彡(゚)(゚)
Reference
이 문제에 관하여(SQL 재귀 WITH 절에서 nPr(n = r)의 한 자리 숫자 순열을 생성해 봅니다. (Oracle Database)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ora_gonsuke777/items/36dd471d2d7299d7fab8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)