2013-09-28 2 views
1

테이블의 열에있는 모든 고유 한 값 조합을 찾아야합니다. 예를 들어, 컬럼 값 1,2,3,4,5의 경우. 결과가 [1,2], [1,3], [1,4], [1,5], [2,1], [2,3] 등이되기를 원합니다.고유 한 값의 조합 테이블의 열

감사합니다. 포인터를 사용하여 값의 조합을 찾기 위해 쿼리를 구성합니다.

감사

cross join

답변

1

는 유용 할 수 있습니다. http://www.sqlfiddle.com/#!12/59af5/1

은 ANSI SQL 구문은 CROSS JOIN 연산자를 사용합니다 :

create table val(x int); 
insert into val values(1),(2),(3),(4),(5); 

SELECT a.x a, b.x b 
FROM val a 
CROSS JOIN val b 
WHERE a.x <> b.x 
ORDER BY a,b; 



대부분의 DBMS 시스템에서 작동해야 CROSS JOIN없이이 쿼리의 또 다른 형태지만, ANSI 형식이 권장

이 데모를 참조하십시오 선명도 :

SELECT a.x a, b.x b 
FROM val a, val b 
WHERE a.x <> b.x 
ORDER BY a,b; 


큰 데이터 세트에 대한 교차 조인은 1000 -> 1.000.000 행에 대해 100x100 = 10.000 행을 생성하는 100 개의 값에 대해 데이터베이스 성능을 저하시킬 수 있음에 유의하십시오.

+0

답장을 보내 주셔서 감사합니다. kordirko. 나는 구글 bigquery에서 이것을 할 길을 찾고있다. – sunil

2

상수 키 값을 추가하는 하위 선택을 사용하여 BigQuery에서 크로스 조인을 수행 한 다음 해당 상수 값에 합류 할 수 있습니다. 예를 들어

가 여기 크로스 조인 계산하는 쿼리 {1, 2, 3} 및 {2, 4, 6}

SELECT t1.num as first, t2.num as second 
FROM (
    SELECT num, 1 as key 
    FROM (
     SELECT 1 as num), (
     SELECT 2 as num), (
     SELECT 3 as num)) as t1 
JOIN (
    SELECT num, 1 as key 
    FROM (
     SELECT 2 as num), (
     SELECT 4 as num), (
     SELECT 6 as num)) as t2 
ON t1.key = t2.key 
WHERE t1.num <> t2.num 

참고 이것은 BigQuery에 "트릭"에 사용 두 개의 입력 테이블을 작성하십시오. 기존 테이블로이 작업을 수행했다면 다음과 같이 보입니다.

SELECT t1.num as first, t2.num as second 
FROM (
    SELECT foo as num, 1 as key 
    FROM [my_dataset.my_table]) as t1 
JOIN (
    SELECT foo as num, 1 as key 
    FROM [my_dataset.my_table]) as t2 
ON t1.key = t2.key 
WHERE t1.num <> t2.num