ARRAY JOIN 절이 수행하는 가장 기본적인 형태입니다.
이 이름은 배열 또는 중첩 데이터 구조에 대해 JOIN을 수행하는 것으로 볼 수 있다는 데서 유래했습니다. 의도는 arrayJoin 함수와 비슷하지만, 절의 기능이 더 넓습니다.
구문:
ARRAY JOIN 유형은 다음과 같습니다:
ARRAY JOIN- 기본적으로 빈 배열은JOIN결과에 포함되지 않습니다.LEFT ARRAY JOIN-JOIN결과에는 빈 배열을 가진 행도 포함됩니다. 빈 배열의 값은 배열 요소 타입의 기본값(일반적으로 0, 빈 문자열 또는 NULL)으로 설정됩니다.
기본 ARRAY JOIN 예시
ARRAY JOIN 및 LEFT ARRAY JOIN
ARRAY JOIN 및 LEFT ARRAY JOIN 절의 사용 방법을 보여줍니다. Array 타입의 컬럼이 있는 테이블을 생성하고 여기에 값을 삽입해 보겠습니다:
ARRAY JOIN 절을 사용합니다:
LEFT ARRAY JOIN 절을 사용합니다:
ARRAY JOIN 및 arrayEnumerate 함수
ARRAY JOIN과 함께 사용됩니다. ARRAY JOIN을 적용한 후 각 배열별로 항목을 한 번만 집계할 수 있습니다. 예시:
ARRAY JOIN 적용 후 받은 문자열 수)를 의미하고, Hits는 페이지뷰 수(ARRAY JOIN 적용 전의 문자열 수)를 의미합니다. 이 사례에서는 더 간단한 방법으로도 동일한 결과를 얻을 수 있습니다:
ARRAY JOIN 및 arrayEnumerateUniq
ARRAY JOIN을 사용해 배열 요소를 집계할 때 유용합니다.
이 예시에서는 각 목표 ID별로 전환 수(중첩된 Goals 데이터 구조의 각 요소는 달성된 목표이며, 이를 전환이라고 합니다)와 세션 수를 계산합니다. ARRAY JOIN이 없다면 세션 수는 sum(Sign)으로 계산했을 것입니다. 하지만 이 경우에는 중첩된 Goals 구조 때문에 행 수가 늘어났으므로, 이후 각 세션을 한 번씩만 집계하기 위해 arrayEnumerateUniq(Goals.ID) 함수 값에 조건을 적용합니다.
별칭 사용
ARRAY JOIN 절에서 배열에 별칭을 지정할 수 있습니다. 이 경우 배열 항목은 이 별칭으로 참조할 수 있지만, 배열 자체는 원래 이름으로 참조합니다. 예시:
ARRAY JOIN을 수행할 수 있습니다. 예를 들면 다음과 같습니다:
ARRAY JOIN 절에서 쉼표로 구분할 수 있습니다. 이 경우 JOIN은 이들에 대해 동시에 수행됩니다(카테시안 곱이 아니라 직접합입니다). 기본적으로 모든 배열의 크기는 같아야 한다는 점에 유의하십시오. 예시:
SETTINGS enable_unaligned_array_join = 1을 사용하면 조인할 수 있습니다. 예시:
중첩 데이터 구조의 ARRAY JOIN
ARRAY JOIN은 중첩 데이터 구조에서도 사용할 수 있습니다:
ARRAY JOIN에서 중첩 데이터 구조의 이름을 지정하면, 해당 구조를 이루는 모든 배열 요소에 ARRAY JOIN을 적용한 것과 같은 의미입니다. 아래에 예시를 나열합니다:
JOIN 결과 또는 소스 배열을 선택할 수 있습니다. 예시:
구현 세부 사항
ARRAY JOIN을 실행할 때 쿼리 실행 순서는 최적화됩니다. 쿼리에서는 ARRAY JOIN을 항상 WHERE/PREWHERE 절보다 앞에 지정해야 하지만, ARRAY JOIN의 결과를 필터링에 사용하지 않는다면 기술적으로는 어느 쪽을 먼저 수행해도 됩니다. 처리 순서는 쿼리 옵티마이저가 제어합니다.
쇼트서킷 함수 평가와의 비호환성
if, multiIf, and, or와 같은 특정 함수에서 복잡한 표현식의 실행을 최적화하는 기능입니다. 이 기능은 이러한 함수를 실행하는 동안 0으로 나누기와 같은 잠재적인 예외가 발생하지 않도록 합니다.
arrayJoin은 항상 실행되며 쇼트서킷 함수 평가를 지원하지 않습니다. 이는 arrayJoin이 쿼리 분석 및 실행 과정에서 다른 모든 함수와 별도로 처리되는 고유한 함수이고, 쇼트서킷 함수 실행과는 호환되지 않는 추가 로직이 필요하기 때문입니다. 또한 결과의 행 수는 arrayJoin의 결과에 따라 달라지므로, arrayJoin의 지연 실행을 구현하는 것은 지나치게 복잡하고 비용도 많이 듭니다.