Saltar al contenido principal

Nested(name1 Type1, Name2 Type2, …)

Una estructura de datos anidada es como una tabla dentro de una celda. Los parámetros de una estructura de datos anidada —los nombres y tipos de las columnas— se especifican igual que en una consulta CREATE TABLE. Cada fila de la tabla puede corresponder a cualquier cantidad de filas en una estructura de datos anidada.
Evite usar puntos en los nombres de las columnasLos nombres de columna que contienen puntos, las columnas que comparten un prefijo común separado por punto y las columnas con el tipo Array pueden interpretarse como parte de una estructura Nested aplanada cuando flatten_nested = 1 (valor predeterminado). Esto puede provocar una validación inesperada de la longitud de los arrays en las operaciones de inserción y restricciones al cambiar el nombre.Evite usar puntos en los nombres de las columnas siempre que sea posible. Use guiones bajos (_) u otro separador en lugar de puntos en los nombres de las columnas, a menos que necesite intencionadamente la semántica de Nested.
Ejemplo:
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 ejemplo declara la estructura de datos anidada Goals, que contiene datos sobre conversiones (objetivos alcanzados). Cada fila de la tabla ‘visits’ puede corresponder a cero o más conversiones. Cuando flatten_nested se establece en 0 (que no es el valor predeterminado), se admiten niveles arbitrarios de anidamiento. En la mayoría de los casos, cuando se trabaja con una estructura de datos anidada, sus columnas se especifican mediante nombres de columna separados por un punto. Estas columnas forman un array de tipos coincidentes. Todos los arrays de columnas de una misma estructura de datos anidada tienen la misma longitud. Ejemplo:
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'] │
└────────────────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────┘
La forma más sencilla de entender una estructura de datos anidada es verla como un conjunto de varios arrays de columnas de la misma longitud. El único lugar en el que una consulta SELECT puede especificar el nombre de una estructura de datos anidada completa en lugar de columnas individuales es la cláusula ARRAY JOIN. Para obtener más información, consulte “cláusula ARRAY JOIN”. Ejemplo:
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 │
└─────────┴─────────────────────┘
No se puede realizar un SELECT sobre una estructura de datos anidada completa. Solo se pueden enumerar explícitamente las columnas individuales que la componen. Para una consulta INSERT, debe pasar por separado todos los arrays de columnas de una estructura de datos anidada (como si fueran arrays de columnas individuales). Durante la inserción, el sistema comprueba que tengan la misma longitud. Para una consulta DESCRIBE, las columnas de una estructura de datos anidada se enumeran por separado de la misma manera. La consulta ALTER para los elementos de una estructura de datos anidada tiene limitaciones.
Última modificación el 10 de junio de 2026