메인 콘텐츠로 건너뛰기

Nested(name1 Type1, Name2 Type2, …)

중첩 데이터 구조는 셀 내부에 있는 테이블과 같습니다. 중첩 데이터 구조의 매개변수, 즉 컬럼 이름과 타입은 CREATE TABLE 쿼리와 동일한 방식으로 지정합니다. 각 테이블 행은 중첩 데이터 구조의 여러 행에 대응할 수 있습니다.
컬럼 이름에 점을 사용하지 마십시오점이 포함된 컬럼 이름, 동일한 점 접두사를 공유하는 컬럼, 그리고 Array 타입의 컬럼은 flatten_nested = 1(기본값)일 때 평탄화된 Nested 구조의 일부로 해석될 수 있습니다. 이로 인해 삽입 시 예상치 못한 배열 길이 유효성 검사와 이름 변경 제한이 발생할 수 있습니다.가능하면 컬럼 이름에 점을 사용하지 마십시오. 의도적으로 Nested 의미 체계가 필요한 경우가 아니라면, 컬럼 이름에서는 점 대신 밑줄(_)이나 다른 구분자를 사용하십시오.
예시:
CREATE TABLE test.visits
(
    CounterID UInt32,
    StartDate Date,
    Sign Int8,
    IsNew UInt8,
    VisitID UInt64,
    UserID UInt64,
    ...
    Goals Nested
    (
        ID UInt32,
        Serial UInt32,
        EventTime DateTime,
        Price Int64,
        OrderID String,
        CurrencyID UInt32
    ),
    ...
) ENGINE = CollapsingMergeTree(StartDate, intHash32(UserID), (CounterID, StartDate, intHash32(UserID), VisitID), 8192, Sign)
이 예시에서는 전환(목표 달성) 관련 데이터를 포함하는 Goals 중첩 데이터 구조를 선언합니다. visits 테이블의 각 행은 전환이 없을 수도 있고, 여러 개의 전환에 해당할 수도 있습니다. flatten_nested0으로 설정하면(기본값은 아님) 중첩을 임의의 수준까지 지원합니다. 대부분의 경우 중첩 데이터 구조를 사용할 때는 점으로 구분된 컬럼 이름으로 컬럼을 지정합니다. 이러한 컬럼은 동일한 타입의 배열을 이룹니다. 하나의 중첩 데이터 구조에 속한 모든 컬럼 배열의 길이는 같습니다. 예시:
SELECT
    Goals.ID,
    Goals.EventTime
FROM test.visits
WHERE CounterID = 101500 AND length(Goals.ID) < 5
LIMIT 10
┌─Goals.ID───────────────────────┬─Goals.EventTime───────────────────────────────────────────────────────────────────────────┐
│ [1073752,591325,591325]        │ ['2014-03-17 16:38:10','2014-03-17 16:38:48','2014-03-17 16:42:27']                       │
│ [1073752]                      │ ['2014-03-17 00:28:25']                                                                   │
│ [1073752]                      │ ['2014-03-17 10:46:20']                                                                   │
│ [1073752,591325,591325,591325] │ ['2014-03-17 13:59:20','2014-03-17 22:17:55','2014-03-17 22:18:07','2014-03-17 22:18:51'] │
│ []                             │ []                                                                                        │
│ [1073752,591325,591325]        │ ['2014-03-17 11:37:06','2014-03-17 14:07:47','2014-03-17 14:36:21']                       │
│ []                             │ []                                                                                        │
│ []                             │ []                                                                                        │
│ [591325,1073752]               │ ['2014-03-17 00:46:05','2014-03-17 00:46:05']                                             │
│ [1073752,591325,591325,591325] │ ['2014-03-17 13:28:33','2014-03-17 13:30:26','2014-03-17 18:51:21','2014-03-17 18:51:45'] │
└────────────────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────┘
중첩 데이터 구조는 길이가 같은 여러 개의 컬럼 배열로 이루어진 집합이라고 생각하는 것이 가장 쉽습니다. SELECT 쿼리에서 개별 컬럼 대신 중첩 데이터 구조 전체의 이름을 지정할 수 있는 유일한 곳은 ARRAY JOIN 절입니다. 자세한 내용은 “ARRAY JOIN 절”을 참조하십시오. 예시:
SELECT
    Goal.ID,
    Goal.EventTime
FROM test.visits
ARRAY JOIN Goals AS Goal
WHERE CounterID = 101500 AND length(Goals.ID) < 5
LIMIT 10
┌─Goal.ID─┬──────Goal.EventTime─┐
│ 1073752 │ 2014-03-17 16:38:10 │
│  591325 │ 2014-03-17 16:38:48 │
│  591325 │ 2014-03-17 16:42:27 │
│ 1073752 │ 2014-03-17 00:28:25 │
│ 1073752 │ 2014-03-17 10:46:20 │
│ 1073752 │ 2014-03-17 13:59:20 │
│  591325 │ 2014-03-17 22:17:55 │
│  591325 │ 2014-03-17 22:18:07 │
│  591325 │ 2014-03-17 22:18:51 │
│ 1073752 │ 2014-03-17 11:37:06 │
└─────────┴─────────────────────┘
중첩 데이터 구조 전체를 대상으로 SELECT를 수행할 수는 없습니다. 그 안에 포함된 개별 컬럼만 명시적으로 나열할 수 있습니다. INSERT 쿼리에서는 중첩 데이터 구조를 구성하는 모든 컬럼 배열을 각각 별도로 전달해야 합니다(마치 개별 컬럼 배열인 것처럼). 삽입 시 시스템은 이들의 길이가 같은지 확인합니다. DESCRIBE 쿼리에서도 중첩 데이터 구조의 컬럼은 같은 방식으로 각각 별도로 나열됩니다. 중첩 데이터 구조의 요소에 대한 ALTER 쿼리에는 제한이 있습니다.
마지막 수정일 2026년 6월 10일