Estou tentando fazer algo como:
SELECT * FROM table LIMIT 10,20
ou
SELECT * FROM table LIMIT 10 OFFSET 10
mas usando o SQL Server
A única solução que encontrei parece exagerada:
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY name) as row FROM sys.databases
) a WHERE row > 5 and row <= 10
Eu também encontrei :
SELECT TOP 10 * FROM stuff;
... mas não é o que eu quero fazer, pois não posso especificar o limite inicial.
Existe outra maneira de fazer isso?
Além disso, apenas curioso, existe uma razão pela qual o SQL Server não suporta a LIMIT
função ou algo semelhante? Eu não quero ser mau, mas isso realmente soa como algo que um SGBD precisa ... Se isso acontecer, sinto muito por ser tão ignorante! Eu tenho trabalhado com MySQL e SQL + nos últimos 5 anos, então ...
sql
sql-server
pagination
limit
marcgg
fonte
fonte
ROW_NUMBER()
e limitar comTOP
a largura do intervalo e umaWHERE
condição para um limite do intervalo é o melhor que consegui alcançar. Eu também notei um desempenho muito melhor se aTOP
cláusula usa um literal em vez de variávelRespostas:
A
LIMIT
cláusula não faz parte do SQL padrão. É suportado como uma extensão de fornecedor para SQL pelo MySQL, PostgreSQL e SQLite.Outras marcas de banco de dados podem ter recursos semelhantes (por exemplo,
TOP
no Microsoft SQL Server), mas nem sempre funcionam de forma idêntica.É difícil usar
TOP
no Microsoft SQL Server para imitar aLIMIT
cláusula. Há casos em que simplesmente não funciona.A solução que você mostrou
ROW_NUMBER()
está disponível no Microsoft SQL Server 2005 e posterior. Esta é a melhor solução (por enquanto) que funciona apenas como parte da consulta.Outra solução é usar
TOP
para buscar a primeira contagem + linhas de deslocamento e, em seguida, usar a API para procurar além das primeiras linhas de deslocamento .Veja também:
fonte
Para o SQL Server 2012 +, você pode usar .
fonte
offset
ou pode deixar essa linha de fora (assumindo que não deseja um deslocamento)?OFFSET 0 ROWS
Parse error at line: 4, column: 1: Incorrect syntax near 'OFFSET'
como você encontrou, este é o método preferido do servidor sql:
fonte
a
depois da seleção interna? Eu suponho que você esteja dando um alias ao select interno, mas você nunca parece usá-lo ... Você deveria fazer isso ema.row
vez de apenasrow
?( )
tabela derivada, mas ela será liberada se você esquecer de usá-lo para se referir às colunas. Eu consertei isso ...Se você estiver usando o SQL Server 2012+, vote na resposta de Martin Smith e use as extensões
OFFSET
eFETCH NEXT
paraORDER BY
,Se você tiver a infelicidade de ficar preso a uma versão anterior, poderá fazer algo assim,
Eu acredito que é funcionalmente equivalente a
e a maneira com o melhor desempenho que eu conheço em TSQL, antes do MS SQL 2012.
Se houver muitas linhas, você poderá obter um melhor desempenho usando uma tabela temporária em vez de uma CTE.
fonte
Infelizmente, o
ROW_NUMBER()
melhor é o que você pode fazer. Na verdade, é mais correto, porque os resultados de uma cláusulalimit
outop
realmente não têm significado sem respeitar uma ordem específica. Mas ainda é difícil de fazer.Atualização: o Sql Server 2012 adiciona um
limit
recurso semelhante via palavras-chave OFFSET e FETCH . Esta é a abordagem ansi-padrão, ao contrário deLIMIT
, que é uma extensão MySql não-padrão.fonte
Que tal agora?
Ele fornece as últimas 10 linhas das 20 primeiras linhas. Uma desvantagem é que a ordem é revertida, mas, pelo menos, é fácil lembrar.
fonte
Deve dar registros 11-20. Provavelmente não é muito eficiente se estiver incrementando para obter mais páginas e não tem certeza de como isso pode ser afetado pelo pedido. Pode ser necessário especificar isso nas duas declarações WHERE.
fonte
Uma boa maneira é criar um procedimento:
assim como o limite 0,2 /////////////// execute pagination 0,4
fonte
Apenas para a solução de registro que funciona na maioria dos mecanismos de banco de dados, embora possa não ser a mais eficiente:
Nota anterior: a última página ainda conteria linhas ReturnCount, independentemente do que seja SkipCount. Mas isso pode ser uma coisa boa em muitos casos.
fonte
O equivalente a LIMIT é SET ROWCOUNT, mas se você quiser paginação genérica, é melhor escrever uma consulta como esta:
fonte
Irá imprimir linhas de 10 a 15.
fonte
Até agora, esse formato é o que está funcionando para mim (embora não seja o melhor desempenho):
Uma observação lateral, paginar sobre dados dinâmicos pode levar a resultados estranhos / inesperados.
fonte
Na documentação online do MS SQL Server ( http://technet.microsoft.com/en-us/library/ms186734.aspx ), eis o exemplo deles que testei e trabalho para recuperar um conjunto específico de linhas. ROW_NUMBER exige um OVER, mas você pode solicitar o que quiser:
fonte
Use todo o servidor SQL:; com tbl como (SELECT ROW_NUMBER () over (ordem de (selecione 1)) como RowIndex, * da tabela) selecione os 10 principais * de tbl onde RowIndex> = 10
fonte
imprimirá de 15 a 25 como limite em MYSQl
fonte