Saltar al contenido principal
La función de tabla Merge nos permite consultar varias tablas en paralelo. Para ello, crea una tabla temporal Merge y deriva la estructura de esta tabla a partir de la unión de sus columnas y de la deducción de tipos comunes.

Preparar las tablas

Vamos a aprender a usar esta función con la ayuda del conjunto de datos de tenis de Jeff Sackmann. Vamos a procesar archivos CSV que contienen partidos desde la década de 1960, pero crearemos un esquema ligeramente distinto para cada década. También añadiremos un par de columnas adicionales para la década de 1990. A continuación se muestran las sentencias de importación:

Esquema de varias tablas

Podemos ejecutar la siguiente consulta para listar, una junto a otra, las columnas de cada tabla con sus tipos, de modo que sea más fácil ver las diferencias.
Veamos las diferencias:
  • En los años 70, el tipo de winner_seed cambia de Nullable(String) a Nullable(UInt8), y score de String a Array(String).
  • En los años 80, winner_seed y loser_seed cambian de Nullable(UInt8) a Nullable(UInt16).
  • En los años 90, surface cambia de String a Enum('Hard', 'Grass', 'Clay', 'Carpet') y se añaden las columnas walkover y retirement.

Consultar varias tablas con merge

Escribamos una consulta para encontrar los partidos que John McEnroe ganó contra alguien que era cabeza de serie n.º 1:
A continuación, supongamos que queremos filtrar esas coincidencias para encontrar aquellas en las que McEnroe era cabeza de serie n.º 3 o menos. Esto es un poco más complicado porque winner_seed usa distintos tipos en las distintas tablas:
Usamos la función variantType para comprobar el tipo de winner_seed en cada fila y luego variantElement para extraer el valor subyacente. Cuando el tipo es String, lo convertimos en un número y luego hacemos la comparación. A continuación se muestra el resultado de ejecutar la consulta:

¿De qué tabla proceden las filas al usar merge?

¿Y si queremos saber de qué tabla proceden las filas? Podemos usar la columna virtual _table para hacerlo, como se muestra en la siguiente consulta:
También podríamos usar esta columna virtual como parte de una consulta para contar los valores de la columna walkover:
Podemos ver que la columna walkover es NULL en todos los casos excepto en atp_matches_1990s. Tendremos que actualizar nuestra consulta para comprobar si la columna score contiene la cadena W/O cuando la columna walkover es NULL:
Si el tipo subyacente de score es Array(String), tenemos que recorrer el array y buscar W/O, mientras que, si es de tipo String, podemos simplemente buscar W/O en el texto.
Última modificación el 1 de julio de 2026