TOP (Transact-SQL) (Português)

  • 16/03/2017
  • 11 minutos para ler
    • V
    • M
    • r
    • c
    • d
    • +12

Aplica-se a: SQL Server (todas as versões com suporte) Banco de dados SQL do Azure Instância gerenciada do Azure SQL Azure Synapse Analytics Parallel Data Warehouse

Limita as linhas retornadas em um conjunto de resultados de consulta a um número especificado de linhas ou porcentagem de linhas no SQL Server. Quando você usa TOP com a cláusula ORDER BY, o conjunto de resultados é limitado ao primeiro número N de linhas ordenadas. Caso contrário, TOP retorna o primeiro número N de linhas em uma ordem indefinida. Use esta cláusula para especificar o número de linhas retornadas de uma instrução SELECT. Ou use TOP para especificar as linhas afetadas por uma instrução INSERT, UPDATE, MERGE ou DELETE.

Convenções de sintaxe Transact-SQL

Sintaxe

A seguir está a sintaxe do SQL Server e do Banco de Dados SQL do Azure:

A seguir está a sintaxe do Azure Synapse Analytics e Parallel Data Warehouse:

Observação

Para visualizar a sintaxe Transact-SQL do SQL Server 2014 e anterior, consulte a documentação das versões anteriores .

Argumentos

expression
A expressão numérica que especifica o número de linhas a serem retornadas. expressão é convertida implicitamente em um valor flutuante se você especificar PERCENT. Caso contrário, a expressão é convertida em bigint.

PERCENT
Indica que a consulta retorna apenas a primeira porcentagem da expressão das linhas do conjunto de resultados. Os valores fracionários são arredondados para o próximo valor inteiro.

WITH TIES
Retorna duas ou mais linhas que empatam para o último lugar no conjunto de resultados limitados. Você deve usar este argumento com a cláusula ORDER BY. WITH TIES pode fazer com que mais linhas sejam retornadas do que o valor especificado na expressão. Por exemplo, se a expressão for definida como 5, mas duas linhas adicionais corresponderem aos valores das colunas ORDER BY na linha 5, o conjunto de resultados conterá sete linhas.

Você pode especificar a cláusula TOP com WITH TIES argumento apenas em instruções SELECT e apenas se você também especificou a cláusula ORDER BY. A ordem retornada de registros vinculados é arbitrária. ORDER BY não afeta esta regra.

Melhores práticas

Em uma instrução SELECT, sempre use uma cláusula ORDER BY com a cláusula TOP. Porque, é a única maneira de indicar previsivelmente quais linhas são afetadas por TOP.

Use OFFSET e FETCH na cláusula ORDER BY em vez da cláusula TOP para implementar uma solução de paginação de consulta. Uma solução de paginação ( ou seja, enviar blocos ou “páginas” de dados para o cliente) é mais fácil de implementar usando as cláusulas OFFSET e FETCH. Para obter mais informações, consulte a cláusula ORDER BY (Transact-SQL).

Use TOP (ou OFFSET e FETCH) em vez de SET ROWCOUNT para limitar o número de linhas retornadas. Esses métodos têm preferência em vez de SET ROWCOUNT pelos seguintes motivos:

  • Como parte de uma instrução SELECT, o otimizador de consulta pode considerar o valor da expressão nas cláusulas TOP ou FETCH durante a otimização da consulta. Como você usa SET ROWCOUNT fora de uma instrução que executa uma consulta, seu valor não pode ser considerado em um plano de consulta.

Suporte de compatibilidade

Para compatibilidade com versões anteriores, os parênteses são opcionais nas instruções SELECT se a expressão for um inteiro const formiga. Recomendamos que você sempre use parênteses para TOP nas instruções SELECT. Isso fornece consistência com seu uso obrigatório nas instruções INSERT, UPDATE, MERGE e DELETE.

Interoperabilidade

A expressão TOP não afeta as instruções que podem ser executadas por causa de um gatilho. As tabelas inseridas e excluídas nos gatilhos retornam apenas as linhas que são realmente afetadas pelas instruções INSERT, UPDATE, MERGE ou DELETE. Por exemplo, se um INSERT TRIGGER disparar como resultado de uma instrução INSERT que usou uma cláusula TOP.

O SQL Server permite a atualização de linhas por meio de visualizações. Como você pode incluir a cláusula TOP na definição de visualização, certas linhas podem desaparecer da visualização se não atenderem mais aos requisitos da expressão TOP devido a uma atualização .

Quando especificado na instrução MERGE, a cláusula TOP se aplica depois que toda a tabela de origem e toda a tabela de destino são unidas. E as linhas unidas que não se qualificam para uma inserção, atualização ou exclusão ação são removidos. A cláusula TOP reduz ainda mais o número de linhas unidas para o valor especificado e as ações de inserção, atualização ou exclusão se aplicam às linhas unidas restantes de forma não ordenada. Ou seja, não há ordem na qual as linhas sejam distribuídas entre as ações definidas nas cláusulas WHEN.Por exemplo, se a especificação de TOP (10) afeta 10 linhas, dessas linhas, sete podem ser atualizadas e três inseridas. Ou, um pode ser excluído, cinco atualizados e quatro inseridos e assim por diante. Como a instrução MERGE faz uma varredura completa das tabelas de origem e de destino, o desempenho de E / S pode ser afetado quando você usa a cláusula TOP para modificar uma tabela grande criando vários lotes. Nesse cenário, é importante garantir que todos os lotes sucessivos visem novas linhas.

Tenha cuidado ao especificar a cláusula TOP em uma consulta que contém UNION, UNION ALL, EXCEPT ou INTERSECT operador. É possível escrever uma consulta que retorna resultados inesperados porque a ordem em que as cláusulas TOP e ORDER BY são processadas logicamente nem sempre é intuitiva quando esses operadores são usados em uma operação de seleção. Por exemplo, considerando a tabela e os dados a seguir, suponha que você deseja devolver o carro vermelho mais barato e o carro azul mais barato. Ou seja, o sedan vermelho e a van azul.

Para obter esses resultados, você pode escrever a seguinte consulta.

A seguir está o conjunto de resultados.

Os resultados inesperados são retornados porque a cláusula TOP é executada logicamente antes da cláusula ORDER BY, que classifica os resultados do operador (UNION ALL neste caso). Portanto, a consulta anterior retorna qualquer carro vermelho e qualquer carro azul e, a seguir, ordena o resultado dessa união pelo preço. O exemplo a seguir mostra o método correto de escrever essa consulta para obter o resultado desejado.

Usando TOP e ORDER BY em uma operação de subseleção, você garante que os resultados da cláusula ORDER BY sejam aplicados ao TOP cláusula e não para classificar o resultado da operação UNION.

Aqui está o conjunto de resultados.

Limitações e restrições

Quando você usa TOP com INSERT, UPDATE, MERGE ou DELETE, as linhas referenciadas não são organizadas em nenhuma ordem. E você não pode especificar diretamente a cláusula ORDER BY nessas instruções. Se você precisar usar TOP para inserir, excluir ou modificar linhas em uma ordem cronológica significativa, use TOP com uma cláusula ORDER BY especificada em uma instrução subselect. Consulte a seção de exemplos a seguir neste artigo.

Você não pode usar TOP em uma instrução UPDATE e DELETE em visualizações particionadas.

Você não pode combinar TOP com OFFSET e FETCH em a mesma expressão de consulta (no mesmo escopo de consulta). Para obter mais informações, consulte Cláusula ORDER BY (Transact-SQL).

Exemplos

Categoria Elementos de sintaxe em destaque
Sintaxe básica TOPO • PERCENTUAL
Incluindo valores de empate COM TIES
Limitando as linhas afetadas por DELETE, INSERT ou UPDATE DELETE • INSERT • UPDATE

Sintaxe básica

Os exemplos nesta seção demonstram a funcionalidade básica da cláusula ORDER BY usando a sintaxe mínima necessária.

UMA. Usando TOP com um valor constante

Os exemplos a seguir usam um valor constante para especificar o número de funcionários que são retornados no conjunto de resultados da consulta. No primeiro exemplo, as 10 primeiras linhas indefinidas são retornadas porque uma cláusula ORDER BY não é usada. No segundo exemplo, uma cláusula ORDER BY é usada para retornar os 10 principais funcionários contratados recentemente.

B. Usando TOP com uma variável

O exemplo a seguir usa uma variável para especificar o número de funcionários que são retornados no conjunto de resultados da consulta.

C. Especificando uma porcentagem

O exemplo a seguir usa PERCENT para especificar o número de funcionários que são retornados no conjunto de resultados da consulta. Existem 290 funcionários na tabela HumanResources.Employee. Como cinco por cento de 290 é um valor fracionário, o valor é arredondado para o próximo número inteiro.

Incluindo valores de empate

A. Usando WITH TIES para incluir linhas que correspondem aos valores na última linha

O exemplo a seguir obtém os 10 por cento de todos os funcionários com o salário mais alto a A nd os retorna em ordem decrescente de acordo com seu salário. Especificar WITH TIES garante que os funcionários com salários iguais ao menor salário retornado (a última linha) também sejam incluídos no conjunto de resultados, mesmo se exceder 10 porcentagem de funcionários.

Limitando as linhas afetadas por DELETE, INSERT ou UPDATE

A. Usando TOP para limitar o número de linhas excluídas

Quando você usa uma cláusula TOP (n) com DELETE, a operação de exclusão é feita em uma seleção indefinida de n número de linhas. Ou seja, a instrução DELETE escolhe qualquer (n) número de linhas que atendam aos critérios definidos na cláusula WHERE.O exemplo a seguir exclui 20 linhas da tabela PurchaseOrderDetail com datas de vencimento anteriores a 1º de julho de 2002.

Se você quiser usar TOP para excluir linhas em uma ordem cronológica significativa, use TOP com ORDER BY em uma instrução de subseleção. A consulta a seguir exclui as 10 linhas da tabela PurchaseOrderDetail com as datas de vencimento mais antigas. Para garantir que apenas 10 linhas sejam excluídas, a coluna especificada na instrução subselect (PurchaseOrderID) é a chave primária da tabela. O uso de uma coluna não chave na instrução de subseleção pode resultar na exclusão de mais de 10 linhas se a coluna especificada contiver valores duplicados.

B. Usando TOP para limitar o número de linhas inseridas

O exemplo a seguir cria a tabela EmployeeSales e insere o nome e os dados de vendas do ano até a data para os cinco primeiros funcionários da mesa HumanResources.Employee. A instrução INSERT escolhe quaisquer cinco linhas retornadas pela instrução SELECT que atendam aos critérios definidos na cláusula WHERE. A cláusula OUTPUT exibe as linhas que são inseridas na tabela EmployeeSales. Observe que a cláusula ORDER BY na instrução SELECT não é usada para determinar os cinco principais funcionários.

Se você quiser usar TOP para inserir linhas em uma ordem cronológica significativa, use TOP com ORDER BY em um instrução subselect. O exemplo a seguir mostra como fazer isso. A cláusula OUTPUT exibe as linhas que são inseridas na tabela EmployeeSales. Observe que os cinco principais funcionários agora são inseridos com base nos resultados da cláusula ORDER BY em vez de linhas indefinidas.

C. Usando TOP para limitar o número de linhas atualizadas

O exemplo a seguir usa a cláusula TOP para atualizar linhas em uma tabela. Quando você usa uma cláusula TOP (n) com UPDATE, a operação de atualização é executada em um número indefinido de linhas. Ou seja, a instrução UPDATE escolhe qualquer (n) número de linhas que atendam os critérios definidos na cláusula WHERE. O exemplo a seguir atribui 10 clientes de um vendedor a outro.

Se você precisar use TOP para aplicar atualizações em uma cronologia significativa, você deve usar TOP junto com ORDER BY em uma instrução subselect. O exemplo a seguir atualiza as horas de férias dos 10 funcionários com as primeiras datas de contratação.

Exemplos: Azure Synapse Analytics e Parallel Data Warehouse

O exemplo a seguir retorna as 31 primeiras linhas que correspondem aos critérios da consulta. A cláusula ORDER BY garante que as 31 linhas retornadas sejam as primeiras 31 linhas com base em uma ordem alfabética da coluna LastName.

Usando TOP sem especificar empates.

Resultado: 31 linhas são retornadas.

Usando TOP, especificando WITH TIES.

Resultado: 33 linhas são retornadas, porque três funcionários chamados Brown empatam na 31ª linha.

Consulte também

Deixe uma resposta

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