Qual é a diferença entre TOP e OFFSET & Fetch?

Ambos TOP e OFFSET & FETCH podem ser usados para limitar o número de linhas retornadas. OFFSET e FETCH podem retornar resultados semelhantes ao início, mas existem diferenças que podem influenciar qual método é o melhor para você usar em sua situação.

Todos os exemplos desta lição são baseados no Microsoft SQL Server Management Studio e o banco de dados AdventureWorks2012. Você pode começar a usar essas ferramentas gratuitas usando meu Guia de primeiros passos com o SQL Server.

Qual é a diferença entre TOP e OFFSET & Fetch?

Nas seções a seguir, cobrimos TOP e OFFSET & FETCH. Acho que depois de ler as duas seções, você entenderá suas diferenças. Eles também estão resumidos em uma tabela no final deste artigo.

Top

TOP é usado para retornar um número específico de linhas de um resultado de consulta.

A cláusula TOP está disponível há algum tempo em versões mais antigas do SQL server, como o SQL 2005. TOP não é compatível com ANSI e seu uso é principalmente limitado a produtos Microsoft, como SQL Server e MS-Access.

A cláusula TOP é usada na lista de colunas da instrução SELECT e pode ser usada com ou sem ORDER BY.

Por exemplo, para selecionar os dez produtos menos caros, use

SELECT TOP 10 Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost

Embora ORDER BY não seja obrigatório, é a melhor prática, pois sem ele você não tem garantia de quais linhas serão retornadas.

Um item exclusivo para TOP é a capacidade de retornar uma porcentagem de linhas. A instrução

SELECT TOP 10 PERCENT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost

retorna os 51 principais produtos com o StandardCost mais baixo (ou seja, 504 linhas x 10% = 50,4, arredondado para 51).

Você também pode selecionar um número especificado de registros na parte inferior do resultado de uma consulta. Para fazer isso, você pode usar um truque para ordenar os registros em ordem decrescente:

SELECT TOP 10 Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost DESC

Lembre-se de que quando os resultados são classificados em ordem decrescente, os maiores montantes são devolvidos primeiro. Por isso, o TOP retorna os produtos com o custo padrão mais alto.

O TOP pode ser muito útil em grandes resultados, pois o retorno de milhares de linhas pode afetar o desempenho. Em muitos casos, os usos irão apenas navegar pela parte inicial dos resultados.

TOP pode exibir valores de empates – WITH TIES permite que você também exiba registros adicionais que têm o mesmo valor da última linha do resultado base. / p>

OFFSET e FETCH

OFFSET e FETCH são usados para retornar uma janela de registros de um conjunto de resultados. OFFSET especifica quantas linhas devem ser ignoradas no resultado e FETCH especifica quantas linhas desse ponto em diante devem retornar no resultado.

OFFSET e FETCH foram introduzidos recentemente no SQL Server 2012 e são compatíveis com ANSI.

Você pode usar OFFSET sem FETCH, mas FETCH não pode ser usado sozinho. Independentemente disso, OFFSET deve ser usado com uma cláusula ORDER BY. O motivo é simples, pois OFFSET e FETCH fazem parte da cláusula ORDER BY.

Neste exemplo, as dez primeiras linhas do resultado são ignoradas e as próximas 10 são exibidas no resultado.

SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY

Você pode replicar as linhas retornadas de TOP usando OFFSET e FETCH, desde que os resultados sejam ordenados. A instrução a seguir é o mesmo que retornar o TOP 10:

SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY

Quando OFFSET é definido como 0 nenhuma linha é ignorada. TOP, com OFFSET não há meios embutidos para retornar uma porcentagem de linhas. No entanto, você pode rolar o seu próprio calculando a porcentagem da seguinte maneira:

SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost OFFSET 0 ROWS FETCH NEXT (SELECT CAST(CEILING(COUNT(*) * .1) as INT) FROM Production.Product) ROWS ONLY

O truque está na subconsulta. Ao calcular o número de linhas no resultado, podemos obter uma porcentagem. Aqui está a subconsulta. Se desejar, você pode executá-lo no SQL Server Management Studio.

SELECT CAST(CEILING(COUNT(*) * .1) as INT)FROM Production.Product

Existem vários itens observar:

  • TETO arredonda os números para cima. No nosso exemplo CEILING (50.4) retorna 51.0. Isso simula o comportamento de TOP.
  • FETCH requer um valor inteiro, então CAST é usado para fazer essa conversão. Assim, 51,0 se torna, 51

Para retornar os 10 últimos registros de um resultado, existem dois métodos. Podemos inverter a ordem de classificação como fizemos para TOP:

SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost DESC OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY

Ou podemos preservar a ordem de classificação e calcular o deslocamento de forma que todas as linhas até a última dez são ignorados. Exploramos essa técnica com mais detalhes na lição SQL sobre OFFSET e FETCH.

Resumo das diferenças

Aqui está um resumo de algumas das principais diferenças entre TOP e OFFSET & FETCH.

Comparação de TOP com OFFSET & FETCH

Em geral, se seu objetivo é apenas retornar as primeiras linhas, então acho que TOP é uma solução simples; se você está procurando uma solução de paginação ou precisa selecionar linhas no meio ou na parte inferior dos resultados da consulta sem afetar a ordem de classificação original, acho que OFFSET & FETCH são os melhores.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *