CREATE TABLE anterior declara la estructura de datos anidada Goals, que contiene datos sobre conversiones, u objetivos alcanzados.
Cada fila de la tabla ‘visits’ corresponde a cero o más conversiones.
Cuando la configuración flatten_nested se establece en 0 (flatten_nested=1 de forma predeterminada), se admiten niveles arbitrarios de anidamiento.
En la mayoría de los casos, al trabajar 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 correspondientes.
Todos los arrays de columnas de una misma estructura de datos anidada tienen la misma longitud.
Por ejemplo:
Filtrado de columnas Nested en WHERE
Nested se almacena como un Array, al referenciarla en una cláusula WHERE obtienes el array completo de cada fila, no un elemento individual. No puedes comparar directamente una columna anidada con un valor escalar, así que debes usar funciones de arrays.
Por ejemplo, esta consulta no devuelve silenciosamente cero filas, sino que genera una excepción, porque Goals.ID es de tipo Array(UInt32) y equals(Array(UInt32), UInt32) no es una comparación válida:
has para comprobar si un array contiene un valor específico:
arrayExists cuando la condición sea más compleja:
length o excluir los arrays vacíos con notEmpty:
ARRAY JOIN para expandir primero los arrays.
Después de ARRAY JOIN, cada elemento se convierte en una fila independiente, por lo que la cláusula WHERE se aplica a valores escalares.
Para obtener más información, consulte la cláusula ARRAY JOIN. Ejemplo:
SELECT sobre una estructura de datos anidada completa. Solo se pueden enumerar explícitamente las columnas individuales que forman parte de ella.
Inserción de datos
INSERT, debe pasar por separado todos los arrays de las columnas que componen una estructura de datos anidada (como si fueran arrays de columnas individuales). Durante la inserción, el sistema comprueba que todos tengan la misma longitud.
Cada subcolumna anidada aparece en la lista de columnas con notación de punto (Goals.ID, Goals.Serial, …), y los valores correspondientes son arrays:
DESCRIBE, las columnas de una estructura de datos anidada también se muestran por separado, de la misma manera.
Limitaciones de ALTER
ALTER sobre estructuras de datos anidadas tienen las siguientes limitaciones:
Añadir subcolumnas funciona con normalidad. Puede añadir una nueva subcolumna a una estructura Nested existente:
- Cambiar el nombre de la estructura anidada completa (p. ej.,
GoalsporConversions). - Mover una subcolumna a otra estructura anidada (p. ej.,
Goals.IDaOtherNested.ID). - Sacar una subcolumna de una estructura anidada o moverla a una (p. ej.,
Goals.IDaGoalIDo viceversa).