Comecei a ler sobre Common Table Expression e não consigo pensar em um caso de uso em que precisaria usá-los. Eles parecem redundantes, pois o mesmo pode ser feito com tabelas derivadas. Há algo que estou perdendo ou não entendo bem? Alguém pode me dar um exemplo simples de limitações, com consultas regulares de seleção, derivação ou tabela temporária, no caso da CTE? Quaisquer exemplos simples seriam muito apreciados.
fonte
select top 100 * into #tmp from master..spt_values order by 1,2,3,4 select A.number, COUNT(*) from #tmp A inner join #tmp B ON A.number = B.number+1 group by A.number
vswith CTE AS (select top 100 * from master..spt_values order by 1,2,3,4) select A.number, COUNT(*) from CTE A inner join CTE B ON A.number = B.number+1 group by A.number
Eu os uso para interromper consultas complexas, especialmente junções e subconsultas complexas. Acho que os estou usando cada vez mais como 'pseudo-visualizações' para me ajudar a entender a intenção da consulta.
Minha única reclamação sobre eles é que eles não podem ser reutilizados. Por exemplo, eu posso ter um processo armazenado com duas instruções de atualização que podem usar o mesmo CTE. Mas o 'escopo' do CTE é apenas a primeira consulta.
O problema é que "exemplos simples" provavelmente não precisam realmente de CTE!
Ainda assim, muito útil.
fonte
VIEW
:)Existem duas razões pelas quais vejo o uso de cte.
Para usar um valor calculado na cláusula where. Isso me parece um pouco mais limpo do que uma tabela derivada.
Suponha que haja duas tabelas - Perguntas e Respostas unidas por Questions.ID = Answers.Question_Id (e ID do questionário)
Aqui está outro exemplo em que quero obter uma lista de perguntas e respostas. Quero que as respostas sejam agrupadas com as perguntas nos resultados.
fonte
HAVING
é outra maneira de criar um filtro de estágio final que pode ser semelhante ao uso de um sub-SELECT
Um dos cenários que achei úteis para usar o CTE é quando você deseja obter linhas de dados DISTINCT com base em uma ou mais colunas, mas retorna todas as colunas da tabela. Com uma consulta padrão, você pode primeiro despejar os valores distintos em uma tabela temporária e tentar juntá-los à tabela original para recuperar o restante das colunas ou escrever uma consulta de partição extremamente complexa que possa retornar os resultados em uma execução, mas com maior probabilidade, será ilegível e causará problemas de desempenho.
Porém, usando CTE (conforme respondido por Tim Schmelter em Selecionar a primeira instância de um registro )
Como você pode ver, isso é muito mais fácil de ler e manter. E, em comparação com outras consultas, é muito melhor no desempenho.
fonte
Talvez seja mais significativo pensar em um CTE como um substituto para uma exibição usada para uma única consulta. Mas não requer a sobrecarga, metadados ou persistência de uma exibição formal. Muito útil quando você precisa:
Aqui está um exemplo de recortar e colar para brincar:
Aproveitar
fonte
Hoje vamos aprender sobre a expressão de tabela comum, que é um novo recurso que foi introduzido no SQL Server 2005 e disponível também em versões posteriores.
Expressão comum da tabela: - A expressão comum da tabela pode ser definida como um conjunto de resultados temporário ou, em outras palavras, é um substituto dos modos de exibição no SQL Server. A expressão de tabela comum é válida apenas no lote de instruções em que foi definida e não pode ser usada em outras sessões.
Sintaxe da declaração CTE (Expressão comum da tabela): -
Vamos dar um exemplo: -
Criei duas tabelas employee e Dept e inseri 5 linhas em cada tabela. Agora eu gostaria de juntar essas tabelas e criar um conjunto de resultados temporário para usá-lo ainda mais.
Vamos pegar cada linha da afirmação uma por uma e entender.
Para definir CTE, escrevemos a cláusula "with" e, em seguida, atribuímos um nome à expressão da tabela. Aqui, nomeei como "CTE_Example"
Em seguida, escrevemos "Como" e colocamos nosso código entre dois colchetes (---), podemos juntar várias tabelas entre colchetes.
Na última linha, usei "Select * from CTE_Example", estamos nos referindo à expressão da tabela Common na última linha de código. Assim, podemos dizer que é como uma visualização, onde estamos definindo e usando a visualização em uma única lote e CTE não é armazenado no banco de dados como um objeto permanente. Mas se comporta como uma visão. podemos executar instruções de exclusão e atualização no CTE e isso terá impacto direto na tabela referenciada que está sendo usada no CTE. Vamos dar um exemplo para entender esse fato.
Na instrução acima, estamos excluindo uma linha do CTE_Example e os dados da tabela referenciada "DEPT" que estão sendo usados no CTE.
fonte
É muito útil quando você deseja executar uma "atualização ordenada".
O MS SQL não permite que você use ORDER BY com UPDATE, mas com a ajuda do CTE, é possível fazer o seguinte:
Procure aqui mais informações: Como atualizar e solicitar usando o ms sql
fonte
Um ponto ainda não apontado é a velocidade . Sei que é uma pergunta respondida antiga, mas acho que isso merece comentário / resposta direta:
Quando usei o CTE, fiquei impressionado com a velocidade. Era o caso de um livro didático, muito adequado para o CTE, mas em todas as ocorrências que eu já usei o CTE, houve um ganho de velocidade significativo. Minha primeira consulta foi complexa com tabelas derivadas, demorando muito para ser executada. Com o CTE, levou frações de segundos e me deixou chocado, que é até possível.
fonte
tente isso
fonte