Pular para o conteúdo principal
A função de tabela Merge nos permite consultar várias tabelas em paralelo. Ela faz isso criando uma tabela temporária Merge e determinando a estrutura dessa tabela a partir da união das colunas e da inferência de tipos comuns.

Configurar tabelas

Vamos aprender a usar essa função com a ajuda do conjunto de dados de tênis de Jeff Sackmann. Vamos processar arquivos CSV com partidas desde a década de 1960, mas criaremos um esquema um pouco diferente para cada década. Também adicionaremos algumas colunas extras para a década de 1990. As instruções de importação são apresentadas abaixo:

Esquema de múltiplas tabelas

Podemos executar a seguinte consulta para listar, lado a lado, as colunas e seus tipos em cada tabela, facilitando a visualização das diferenças.
Vamos ver as diferenças:
  • 1970s altera o tipo de winner_seed de Nullable(String) para Nullable(UInt8) e o de score de String para Array(String).
  • 1980s altera winner_seed e loser_seed de Nullable(UInt8) para Nullable(UInt16).
  • 1990s altera surface de String para Enum('Hard', 'Grass', 'Clay', 'Carpet') e adiciona as colunas walkover e retirement.

Consultando várias tabelas com merge

Vamos escrever uma consulta para encontrar as partidas que John McEnroe venceu contra alguém que era o cabeça de chave nº 1:
Em seguida, digamos que queremos filtrar essas partidas para encontrar aquelas em que McEnroe era cabeça de chave nº 3 ou abaixo. Isso é um pouco mais complicado porque winner_seed usa tipos diferentes nas várias tabelas:
Usamos a função variantType para verificar o tipo de winner_seed em cada linha e, em seguida, variantElement para extrair o valor subjacente. Quando o tipo é String, convertemos para um número e então fazemos a comparação. O resultado da execução da consulta é mostrado abaixo:

De qual tabela vêm as linhas ao usar merge?

E se quisermos saber de qual tabela vêm as linhas? Podemos usar a coluna virtual _table para fazer isso, como mostrado na consulta a seguir:
Também poderíamos usar essa coluna virtual em uma consulta para contar os valores da coluna walkover:
Podemos ver que a coluna walkover é NULL em todos os casos, exceto em atp_matches_1990s. Precisaremos atualizar nossa consulta para verificar se a coluna score contém a string W/O quando a coluna walkover for NULL:
Se o tipo subjacente de score for Array(String), precisamos percorrer o array e procurar por W/O; já se for do tipo String, podemos simplesmente procurar W/O na string.
Última modificação em 1 de julho de 2026