Expressões de tabela comuns
SELECT na qual uma expressão de tabela seja permitida.
As subconsultas nomeadas podem ser referenciadas pelo nome no escopo da consulta atual ou nos escopos das subconsultas filhas.
Toda referência a uma expressão de tabela comum em consultas SELECT é sempre substituída pela subconsulta definida em sua definição, caso a CTE não esteja explicitamente definida como materializada (consulte Expressões de tabela comuns materializadas).
A recursão é evitada ocultando a CTE atual do processo de resolução de identificadores.
Observe que as CTEs não garantem os mesmos resultados em todos os locais em que são chamadas, porque a consulta será executada novamente a cada uso.
Sintaxe
Exemplo
1000000
No entanto, como estamos nos referindo a cte_numbers duas vezes, números aleatórios são gerados a cada vez e, consequentemente, vemos resultados aleatórios diferentes, 280501, 392454, 261636, 196227 e assim por diante…
Expressões de tabela comuns materializadas
MATERIALIZED instrui o ClickHouse a executar a subconsulta da CTE exatamente uma vez, armazenar os resultados em uma tabela temporária e atender a todas as referências a partir dessa tabela.
Isso é especialmente útil quando a mesma CTE é referenciada várias vezes em uma consulta (por exemplo, em autorjunções ou em várias subconsultas IN), porque o cálculo subjacente ocorre apenas uma vez.
CTEs materializadas são um recurso experimental.
Elas exigem que o analisador e a configuração
enable_materialized_cte estejam habilitados.Sintaxe
Quando usar
- A mesma CTE é referenciada mais de uma vez em uma consulta.
Sem
MATERIALIZED, cada referência executa a subconsulta novamente, de forma independente. - A CTE contém funções não determinísticas, como
generateRandom. A materialização garante que todas as referências vejam os mesmos dados. - A CTE envolve computações custosas (agregações, junções, varreduras extensas) que não devem ser repetidas.
Exemplos
MATERIALIZED, os dois lados da junção executariam a subconsulta de forma independente.
Com MATERIALIZED, a tabela é lida uma vez, e os dois lados da junção leem da mesma tabela temporária.
generateRandom produzem resultados diferentes a cada referência.
Materializar a CTE garante consistência:
1000000.
Exemplo 3: Encadeamento de CTEs materializadas
CTEs materializadas podem fazer referência a outras CTEs materializadas.
O ClickHouse resolve as dependências e as materializa na ordem correta:
Restrições
- Configuração experimental obrigatória: A configuração
enable_materialized_ctedeve estar habilitada. - Analisador obrigatório: CTEs materializadas só funcionam com o analisador habilitado (
enable_analyzer = 1). - Sem suporte a
RECURSIVE: Não é permitido combinar as palavras-chaveMATERIALIZEDeRECURSIVE, e isso resulta em uma exceçãoUNSUPPORTED_METHOD. - CTEs correlacionadas são proibidas: Uma CTE materializada não pode referenciar colunas de escopos externos da consulta.
Expressões escalares comuns
WITH.
Expressões escalares comuns podem ser referenciadas em qualquer ponto da consulta.
Se uma expressão escalar comum fizer referência a algo diferente de um literal constante, ela poderá levar à presença de variáveis livres.
O ClickHouse resolve qualquer identificador no escopo mais próximo possível, o que significa que variáveis livres podem referenciar entidades inesperadas em caso de conflito de nomes ou levar a uma subconsulta correlacionada.
Recomenda-se definir a CSE como uma função lambda (possível apenas com o analisador habilitado), vinculando todos os identificadores usados para obter um comportamento mais previsível na resolução dos identificadores da expressão.
Sintaxe
Exemplos
extension não está associada no corpo da função lambda gen_name.
Embora extension seja definida como '.txt' como uma expressão escalar comum no escopo da definição e do uso de generated_names, ela é resolvida como uma coluna da tabela extension_list, porque está disponível na subconsulta generated_names.
sum(bytes) da lista de colunas da cláusula SELECT
Consultas recursivas
RECURSIVE permite que uma consulta WITH faça referência ao próprio resultado. Exemplo:
Exemplo: Somar números inteiros de 1 a 100
As CTEs recursivas dependem do analisador de consultas, introduzido na versão
24.3. Se você estiver usando a versão 24.3+ e encontrar uma exceção (UNKNOWN_TABLE) ou (UNSUPPORTED_METHOD), isso sugere que o analisador está desabilitado na sua instância, role ou perfil. Para ativar o analisador, habilite a configuração allow_experimental_analyzer ou atualize a configuração compatibility para uma versão mais recente.
A partir da versão 24.8, o analisador foi oficialmente promovido para produção, e a configuração allow_experimental_analyzer foi renomeada para enable_analyzer.WITH recursiva é sempre: um termo não recursivo, depois UNION ALL e, em seguida, um termo recursivo, em que apenas o termo recursivo pode conter uma referência à própria saída da consulta. A consulta de CTE recursiva é executada da seguinte forma:
- Avalie o termo não recursivo. Coloque o resultado da consulta do termo não recursivo em uma tabela de trabalho temporária.
- Enquanto a tabela de trabalho não estiver vazia, repita estas etapas:
- Avalie o termo recursivo, substituindo a autorreferência recursiva pelo conteúdo atual da tabela de trabalho. Coloque o resultado da consulta do termo recursivo em uma tabela intermediária temporária.
- Substitua o conteúdo da tabela de trabalho pelo conteúdo da tabela intermediária e, em seguida, esvazie a tabela intermediária.
Ordem de busca
Detecção de ciclos
Maximum recursive CTE evaluation depth:
Consultas infinitas
LIMIT for usado na consulta externa:
Exemplo: Consulta com CTE recursiva infinita
Vírgula à direita
WITH: