SQL 자체 결합을 사용하여 수학 순열과 조합을 표현합니다.

소개



SQL에 있어서, 자신은 별로 익숙하지 않은 자기 결합의 향후 도움이 될지도 모르는 테크닉을 소개해 갑니다.

실행 결과는 여기에서 확인할 수 있습니다.

기본 데이터



무언가의 일람이라고 생각해 주세요.
CREATE TABLE members (
  id INT NOT NULL PRIMARY KEY auto_increment,
  name TEXT
);

INSERT INTO members VALUES
    (1, 'tanaka'),
    (2, 'okada'),
    (3, 'hiranuma');

자기 결합을 사용하여 중복 순열을 생성합니다.



중복 순열과는 ... 다른 n 개의 것에서 중복을 허용하고 r 개 취하는 순열
n^r



Query
    SELECT
      M1.name,
      M2.name
    FROM members M1 CROSS JOIN members M2;


Results


name1
name2


타나카
타나카

오카다
타나카

히라누마
타나카

타나카
오카다

오카다
오카다

히라누마
오카다

타나카
히라누마

오카다
히라누마

히라누마
히라누마


이것은 소위 총당전에서 모든 조합을 열거하고 있을 뿐입니다.

자기 결합을 사용하여 순열 만들기 (중복을 허용하지 않음)



이제 테이블members을 사용하여 SQL에서 순열을 표현합니다.

순열은 정렬 순서를 구별하며 당연히 중복되지 않습니다.

이번이라면, 3명의 멤버의 2명으로 나란히 하는 방법이므로, 식으로 하면.
_{3}P_{2}

3×2=6 패턴의 정렬 방법이 있습니다.

이것을 SQL의 자기 결합을 이용해 표현하면 다음과 같이 됩니다.

Query
    SELECT
      M1.name AS name1,
      M2.name AS name2
    FROM members M1
    INNER JOIN members M2 ON M1.name <> M2.name;

Results


name1
name2


오카다
타나카

히라누마
타나카

타나카
오카다

히라누마
오카다

타나카
히라누마

오카다
히라누마


자기결합을 이용한 조합 만들기





이번 사례를 계산하면
_{3}C_{2} \\
= \frac{3\times2}{2} \\
= 3 \\

패턴을 정렬하는 방법이 있습니다.

이것을 SQL의 자기 결합을 이용해 표현하면 다음과 같이 됩니다. 나중에 좋다.

Query
    SELECT
      M1.name AS name1,
      M2.name AS name2
    FROM members M1
    INNER JOIN members M2 ON M1.name > M2.name;

문자 코드 순서대로 정렬하여 자신보다 앞에 오도록 합니다.

Results


name1
name2


타나카
오카다

타나카
히라누마

오카다
히라누마


참조



44-48p

출력 100개 노크 실시 중

좋은 웹페이지 즐겨찾기