Pular para o conteúdo principal

Nested(name1 Type1, Name2 Type2, …)

Uma estrutura de dados aninhada é como uma tabela dentro de uma célula. Os parâmetros de uma estrutura de dados aninhada — os nomes e tipos das colunas — são especificados da mesma forma que em uma consulta CREATE TABLE. Cada linha da tabela pode corresponder a qualquer quantidade de linhas em uma estrutura de dados aninhada.
Evite usar pontos em nomes de colunasNomes de colunas que contêm pontos, colunas que compartilham o mesmo prefixo com ponto e colunas do tipo Array podem ser interpretados como parte de uma estrutura Nested achatada quando flatten_nested = 1 (o padrão). Isso pode causar validação inesperada do tamanho dos arrays durante inserts e restrições de renomeação.Evite usar pontos em nomes de colunas, se possível. Use sublinhados (_) ou outro separador em vez de pontos nos nomes das colunas, a menos que você realmente precise da semântica de Nested.
Exemplo:
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)
Este exemplo declara a estrutura de dados aninhada Goals, que contém dados sobre conversões (metas alcançadas). Cada linha da tabela ‘visits’ pode corresponder a zero ou qualquer quantidade de conversões. Quando flatten_nested é configurado como 0 (o que não é o padrão), níveis arbitrários de aninhamento são suportados. Na maioria dos casos, ao trabalhar com uma estrutura de dados aninhada, suas colunas são especificadas com nomes de colunas separados por um ponto. Essas colunas formam um array de tipos correspondentes. Todos os arrays de colunas de uma mesma estrutura de dados aninhada têm o mesmo comprimento. Exemplo:
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'] │
└────────────────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────┘
É mais fácil pensar em uma estrutura de dados aninhada como um conjunto de várias colunas do tipo array com o mesmo comprimento. O único lugar em que uma consulta SELECT pode especificar o nome de uma estrutura de dados aninhada inteira, em vez de colunas individuais, é a cláusula ARRAY JOIN. Para mais informações, consulte “cláusula ARRAY JOIN”. Exemplo:
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 │
└─────────┴─────────────────────┘
Você não pode executar SELECT para uma estrutura de dados aninhada inteira. Só é possível listar explicitamente as colunas individuais que fazem parte dela. Para uma consulta INSERT, você deve passar separadamente todos os arrays das colunas componentes de uma estrutura de dados aninhada (como se fossem arrays de colunas individuais). Durante a inserção, o sistema verifica se eles têm o mesmo comprimento. Para uma consulta DESCRIBE, as colunas de uma estrutura de dados aninhada são listadas separadamente da mesma forma. A consulta ALTER para elementos de uma estrutura de dados aninhada tem limitações.
Última modificação em 10 de junho de 2026