Existe alguma maneira no SQL Server para obter os resultados iniciando em um determinado deslocamento? Por exemplo, em outro tipo de banco de dados SQL, é possível fazer:
SELECT * FROM MyTable OFFSET 50 LIMIT 25
para obter resultados 51-75. Essa construção não parece existir no SQL Server.
Como posso fazer isso sem carregar todas as linhas que não me interessam? Obrigado!
sql
sql-server
Alex
fonte
fonte
Respostas:
Eu evitaria usar
SELECT *
. Especifique as colunas que você realmente deseja, mesmo que possam ser todas elas.SQL Server 2005 ou superior
SQL Server 2000
Paginando com eficiência por meio de grandes conjuntos de resultados no SQL Server 2000
Um método mais eficiente para paginar através de grandes conjuntos de resultados
fonte
SELECT *
significa que, se a estrutura da tabela mudar, sua consulta ainda será executada, mas fornecerá resultados diferentes. Se uma coluna for adicionada, isso pode ser útil (embora você ainda precise usá-la pelo nome em algum lugar); se uma coluna for excluída ou renomeada, é melhor que seu SQL quebre visivelmente do que o código mais abaixo se comportando de maneira estranha, porque uma variável não é inicializada.Se você estiver processando todas as páginas em ordem, basta lembrar o último valor da chave visto na página anterior e usá-lo
TOP (25) ... WHERE Key > @last_key ORDER BY Key
pode ser o método com melhor desempenho, se existirem índices adequados para permitir a busca eficiente - ou um cursor de API, se não houver. .Para selecionar uma página arbitrária, a melhor solução para o SQL Server 2005 - 2008 R2 é provavelmente
ROW_NUMBER
eBETWEEN
Para o SQL Server 2012+, você pode usar a cláusula ORDER BY aprimorada para essa necessidade.
Embora ainda seja necessário ver o desempenho dessa opção .
fonte
Esta é uma maneira (SQL2000)
e essa é outra maneira (SQL 2005)
fonte
Você pode usar a
ROW_NUMBER()
função para obter o que deseja:fonte
Existe
OFFSET .. FETCH
no SQL Server 2012, mas você precisará especificar umaORDER BY
coluna.Se você realmente não possui nenhuma coluna explícita que possa passar como uma
ORDER BY
coluna (como outros sugeriram), use este truque:... ou
Estamos usando no jOOQ quando os usuários não especificam explicitamente um pedido. Isso produzirá pedidos aleatórios, sem custos adicionais.
fonte
Para tabelas com mais e grandes colunas de dados, prefiro:
-
Ele tem um desempenho muito melhor em tabelas com dados grandes, como BLOBs, porque a função ROW_NUMBER precisa procurar apenas uma coluna e somente as linhas correspondentes são retornadas com todas as colunas.
fonte
Veja minha seleção para paginador
Isso resolve a paginação;)
fonte
fonte
Dependendo da sua versão, você não pode fazê-lo diretamente, mas você pode fazer algo hacky como
onde 'campo' é a chave.
fonte
A seguir, serão exibidos 25 registros, excluindo os primeiros 50 registros de trabalhos no SQL Server 2012.
você pode substituir o ID como sua exigência
fonte
Você deve ter cuidado ao usar a
ROW_NUMBER() OVER (ORDER BY)
declaração, pois o desempenho é muito ruim. O mesmo vale para o uso de expressões comuns de tabela comROW_NUMBER()
isso é ainda pior. Estou usando o seguinte snippet que provou ser um pouco mais rápido do que usar uma variável de tabela com uma identidade para fornecer o número da página.fonte
Eu uso essa técnica para paginação. Eu não busco todas as linhas. Por exemplo, se minha página precisar exibir as 100 principais linhas, busco apenas a cláusula 100 with where. A saída do SQL deve ter uma chave exclusiva.
A tabela possui o seguinte:
A mesma classificação será atribuída a mais de um KeyId.
SQL é
select top 2 * from Table1 where Rank >= @Rank and ID > @Id
Pela primeira vez eu passo 0 para ambos. A segunda vez passa 1 e 14. A terceira vez passa 2 e 6 ....
O valor do 10º registro Rank & Id é passado para o próximo
Isso terá menos estresse no sistema
fonte
No SqlServer2005, você pode fazer o seguinte:
fonte
@Offset + @Limit - 1
? Se @Limit for 10, retornará 11 linhas.A melhor maneira de fazer isso sem perder tempo para solicitar registros é assim:
leva menos de um segundo!
melhor solução para mesas grandes.
fonte
Estou pesquisando essa resposta há um tempo (para consultas genéricas) e descobri outra maneira de fazer isso no SQL Server 2000+ usando ROWCOUNT e cursores e sem TOP ou qualquer tabela temporária.
Usando o,
SET ROWCOUNT [OFFSET+LIMIT]
você pode limitar os resultados e, com os cursores, vá diretamente para a linha que deseja e, em seguida, faça um loop até o fim.Portanto, sua consulta seria assim:
fonte
Com o SQL Server 2012 (11.x) e posterior e o Banco de Dados SQL do Azure, você também pode ter "fetch_row_count_expression", também pode ter a cláusula ORDER BY junto com isso.
https://docs.microsoft.com/en-us/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-ver15
Nota OFFSET Especifica o número de linhas a serem ignoradas antes de começar a retornar linhas da expressão de consulta. NÃO é o número da linha inicial. Portanto, deve ser 0 para incluir o primeiro registro.
fonte