복붙노트

[SQL] 크로스 조합 (하지 순열)는 SQL에 참여

SQL

크로스 조합 (하지 순열)는 SQL에 참여

나는 자신에게 가입 교차하고자하는 테이블이있는 경우, 어떻게 중복 행을 제거 할 수 있습니까? 아니면 다른 방법을 넣어, 내가 가입 교차는 "중요하지 않습니다 순서를"할 수 있습니까?

그래서 예를 들어, 나는 테이블 T이있는 경우 :

field |
-------
   A  |
   B  |
   C  |

나는 내가이 (가)를하지 않도록 자체에 가입 교차 | 행

T as t1
cross join
T as t2
  on t1.field != t2.field

나는 다음을 얻을 것입니다 :

field | field
------+-------
  A   |   B
  A   |   C
  B   |   A
  B   |   C
  C   |   A
  C   |   B

그러나, 나 (A)에, B가 B, A와 같다

이러한 중복을 제거하는 좋은 방법이 있나요? 즉, 나는 조합이 아닌 순열을합니다.

해결법

  1. ==============================

    1.

    T as t1
    inner join
    T as t2
      on t1.field < t2.field
    

    FWIW, 당신은 그냥 엄격히 CROSS 조인 아니라, INNER이 가입 할 수 있습니다. MySQL을 (그리고 아마도 다른 RDBMS) 치료는 이러한 두 가지 유형이 동일로 가입하지만, ANSI SQL에서, 십자가는 어떤 조건에 가입했다 가입하지 - 그것은 의도적 인 데카르트 제품입니다.

  2. from https://stackoverflow.com/questions/7112513/combinations-not-permutations-from-cross-join-in-sql by cc-by-sa and MIT license