Preparar las tablas
Vamos a aprender a usar esta función con la ayuda de la base de datos de partidos ATP de TennisMyLife. 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.- En los años 70, el tipo de
winner_seedcambia deNullable(String)aNullable(UInt8), yscoredeStringaArray(String). - En los años 80,
winner_seedyloser_seedcambian deNullable(UInt8)aNullable(UInt16). - En los años 90,
surfacecambia deStringaEnum('Hard', 'Grass', 'Clay', 'Carpet')y se añaden las columnaswalkoveryretirement.
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:winner_seed usa distintos tipos en las distintas tablas:
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:
walkover:
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:
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.