2011-05-07 3 views
7

n 필드의 고유 조합을 쿼리하는 Oracle의 간단한 방법이 있습니까? 1,2와 2,1가 동일하게 간주되는이 쿼리에서SQL 및 고유 한 n-coulmn 조합

SELECT LEAST(x.a, x.b), 
     GREATEST(x.a,x.b) 
    FROM (SELECT c1.n a, 
       c2.n b 
      FROM combinations c1 
    CROSS JOIN combinations c2 
     WHERE c1.n <> c2.n) x 
GROUP BY LEAST(x.a, x.b), GREATEST(x.a,x.b); 

:

CREATE TABLE combinations AS 
SELECT 1 AS n 
    FROM DUAL 
UNION ALL 
SELECT 2 
    FROM DUAL; 

독특한 조합에 대한 조회 : 나는 매우 간단한 2 필드 솔루션을. 불행하게도 3 필드 구조에서는 작동하지 않습니다 (예 : 1,2,3은 값의 순서가 중요하지 않으므로 3,1,2와 동일하게 간주되어야합니다). 오라클 분석 기능이이 질문에 적절한 솔루션을 제공합니까? 특정 오라클 분석 기능을 제안 해 주시겠습니까?

+1

'<>'대신'<'를 사용하여 가입 할 필요가 없습니까? –

답변

6

2 열에 대한 귀하의 질의는 다음과 같이 다시 작성할 수 있습니다 : 당신이 다음에 필요

SELECT 
    c1.n, 
    c2.n 
FROM combinations c1 
    INNER JOIN combinations c2 ON c1.n < c2.n 

3 열 일부 추가 (굵게 강조 표시) :

SELECT 
    c1.n, 
    c2.n, c3.n 
FROM combinations c1 
    INNER JOIN combinations c2 ON c1.n < c2.n 
    INNER JOIN combinations c3 ON c2.n < c3.n 

이제 더 많은 열에 대해이 비율을 조정하는 방법을 쉽게 추측 할 수있을 것입니다.

0

귀하의 솔루션은 pipelined table function을 사용하여 귀하의 조합을 반환합니다.

함수는 원하는 순서로 필요한 데이터를 반환하는 자체 패키지 (패키지 상태 포함)로 살 수 있습니다. 상태는 초기 시작 값 (A = 1, B = A + 1, C = B + 1, D = C + 1 등)으로 초기화 된 반환 할 열의 수에 따라 결정되는 변수 세트입니다. 그런 다음 단순히

PIPE ROW(a,b,c,d); 
-- increment D 
-- if D overflow limit, increment C and re-init D to C+1 
-- if C overflow limit-1, increment B and re-init C to B+1 
-- if B overflow limit-2, increment A and re-init B to A+1 
-- if A overflow limit-3, the end 

이 출력, N에 대한 = 6

1,2,3,4 
1,2,3,5 
1,2,3,6 
1,2,4,5 
1,2,4,6 
1,3,4,5 
1,3,4,6 
2,3,4,5 
2,3,4,6 
2,3,5,6 
3,4,5,6