JOIN

JOIN (JOINs)

Pinot의 JOIN 지원에 대해 배우는 페이지예요. left, right, full, semi, anti, lateral, equi JOIN을 다룹니다.

출처: JOINs

본문

Pinot는 left, right, full, semi, anti, lateral, equi JOIN을 지원합니다. 두 테이블을 연결해, 테이블 간 관련 컬럼을 기반으로 통합된 뷰를 만들려면 JOIN을 사용하세요.

이 페이지는 join을 작성하는 데 쓰는 문법을 설명합니다. join이 실제로 어떻게 동작하는지 더 깊이 배우려면 Optimizing joins과 Star Tree의 이 블로그를 읽어 보는 것을 권장합니다.

{% hint style="info" %} 중요: JOIN으로 쿼리하려면 Pinot의 멀티 스테이지 엔진(MSE)을 사용해야 합니다. {% endhint %}

INNER JOIN

Inner join은 두 테이블 모두에 일치하는 값이 있는 행을 선택합니다.

문법

SELECT myTable.column1,myTable.column2,myOtherTable.column1,....
FROM mytable INNER JOIN table2
ON table1.matching_column = myOtherTable.matching_column;

inner join 예제

사용자에게 보여진 프로모션 테이블과 사용자 거래 테이블을 조인해, 모든 userID의 지출을 보여 줍니다.

SELECT 
  p.userID, t.spending_val

FROM promotion AS p JOIN transaction AS t 
  ON p.userID = t.userID

WHERE
  p.promotion_val > 10
  AND t.transaction_type IN ('CASH', 'CREDIT')  
  AND t.transaction_epoch >= p.promotion_start_epoch
  AND t.transaction_epoch < p.promotion_end_epoch  

LEFT JOIN

Left join은 왼쪽 관계의 모든 값과 오른쪽 테이블의 일치하는 값을 반환하거나, 일치가 없으면 NULL을 추가합니다. left outer join이라고도 합니다.

문법:

SELECT myTable.column1,table1.column2,myOtherTable.column1,....
FROM myTable LEFT JOIN myOtherTable
ON myTable.matching_column = myOtherTable.matching_column;

RIGHT JOIN

Right join은 오른쪽 관계의 모든 값과 왼쪽 관계의 일치하는 값을 반환하거나, 일치가 없으면 NULL을 추가합니다. right outer join이라고도 합니다.

문법:

SELECT table1.column1,table1.column2,table2.column1,....
FROM table1 
RIGHT JOIN table2
ON table1.matching_column = table2.matching_column;

FULL JOIN

Full join은 두 관계의 모든 값을 반환하며, 일치가 없는 쪽에 NULL 값을 추가합니다. full outer join이라고도 합니다.

문법:

SELECT table1.column1,table1.column2,table2.column1,....
FROM table1 
FULL JOIN table2
ON table1.matching_column = table2.matching_column;

CROSS JOIN

Cross join은 두 관계의 카테시안 곱을 반환합니다. CROSS JOIN과 함께 WHERE 절을 사용하지 않으면 첫 번째 테이블의 행 수와 두 번째 테이블의 행 수를 곱한 결과 집합을 만듭니다. CROSS JOIN에 WHERE 절을 포함하면 INNER JOIN처럼 동작합니다.

문법:

SELECT * 
FROM table1 
CROSS JOIN table2;

SEMI JOIN

Semi-join은 두 번째 테이블에서 일치가 발견된 첫 번째 테이블의 행을 반환합니다. 일치가 발견된 첫 번째 테이블의 각 행에 대해 한 개의 복사본을 반환합니다.

문법:

SELECT myTable.column1, myOtherTable.column1
 FROM myOtherTable
 WHERE EXISTS [ join_criteria ]

다음과 같은 일부 서브쿼리도 내부적으로 semi-join으로 구현됩니다:

SELECT table1.strCol
 FROM  table1
 WHERE table1.intCol IN (select table2.anotherIntCol from table2 where ...)

ANTI JOIN

Anti-join은 두 번째 테이블에서 일치가 발견되지 않은 첫 번째 테이블의 행을 반환합니다. 일치가 발견되지 않은 첫 번째 테이블의 각 행에 대해 한 개의 복사본을 반환합니다.

문법:

SELECT myTable.column1, myOtherTable.column1
 FROM myOtherTable
 WHERE NOT EXISTS [ join_criteria ]

다음과 같은 일부 서브쿼리도 내부적으로 anti-join으로 구현됩니다:

SELECT table1.strCol
 FROM  table1
 WHERE table1.intCol NOT IN (select table2.anotherIntCol from table2 where ...)

Equi join

Equi join은 등호 연산자를 사용해 관련 테이블의 단일 또는 다중 컬럼 값을 일치시킵니다.

문법:

SELECT *
FROM table1 
JOIN table2
[ON (join_condition)]

OR

SELECT column_list 
FROM table1, table2....
WHERE table1.column_name =
table2.column_name; 

ASOF JOIN

ASOF JOIN은 "가장 가까운 일치" 알고리즘을 기반으로 두 테이블에서 행을 선택합니다.

문법:

SELECT * FROM table1 ASOF JOIN table2 
MATCH_CONDITION(table1.col1 <comparison_operator> table2.col1))
ON table1.col2 = table2.col2;

MATCH_CONDITION의 비교 연산자는 <, >, <=, >= 중 하나일 수 있습니다. inner join과 유사하게 ASOF join은 먼저 ON 조건을 기준으로 왼쪽 테이블의 각 행에 대해 오른쪽 테이블의 일치하는 행 집합을 계산합니다. 그러나 이 행들을 모두 반환하는 대신, match 조건을 기준으로 가장 가까운 일치(존재하는 경우) 하나만 반환합니다. MATCH_CONDITION의 두 컬럼은 같은 타입이어야 합니다.

ON의 join 조건은 필수이며 등호 비교의 연결(conjunction)이어야 합니다(즉, 비-등호 join 조건과 OR로 연결된 절은 허용되지 않습니다). join이 MATCH_CONDITION으로만 수행되어야 하면 ON true를 사용할 수 있습니다.

LEFT ASOF JOIN

LEFT ASOF JOIN은 ASOF JOIN과 유사하지만, 오른쪽 테이블에 일치가 없는 행까지 포함해 왼쪽 테이블의 모든 행을 반환하며 일치하지 않는 행은 NULL 값으로 채워진다는 점이 다릅니다(INNER JOIN과 LEFT JOIN의 차이와 유사).

문법:

SELECT * FROM table1 LEFT ASOF JOIN table2 
MATCH_CONDITION(table1.col1 <comparison_operator> table2.col1))
ON table1.col2 = table2.col2;

더 알아보기 (Learn more)