Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Bruno_Ferreira

Clausula semelhante ao LIMIT do MySQL

Recommended Posts

Boa Tarde amigos

 

Estou fazendo uma páginação de resultados de uma consulta no MSSQL 2000 em php.

Notei muitas soluções no laboratório de scripts mas a maioria utilizando o LIMIT do MySQL.

 

Existe no MS Sql Server uma clausula com a mesma função do LIMIT? Preciso por exemplo listar os registros da linha 101 até a linha 200. tem como?

 

Valeu!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu Kandrade, achei interessante o uso de uma tabela temporária, mas como vou usar isso em páginas PHP em paginação, como funcionaria isso? a tabela temporária se manteria mesmo se eu fechasse a conexão ou mudasse de página? como no caso da paginação?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existe uma técnica que consistem em fazer subselects. Imagine que você queiralimitar sua busca por 20 registros. O Top faz o serviço:

 

SELECT TOP(20) * FROM tabela;

 

Agora, e se quisermos apenas os registros a partir da pagina 3 (ou seja, a partir do 41)?

Selecionamos um TOP 40+20 e, a partir desta seleção, pegamos o TOP(20) de cima para baixo, ou seja, do 60 até o 41.

Para terminar pegamos todas as ocorrências do último SELECT reordenando de maneira correta.

Veja:

 

SELECT * FROM
(
	SELECT TOP(20) FROM
	(
		SELECT TOP(60) * FROM tabela ORDER BY coluna ASC
	) AS r1 ORDER BY coluna DESC
) AS r2 ORDER BY coluna ASC

Lembrando que o segundo TOP é variável e é sempre o registro inicial + limite. Ou, se você pensar por paginas, o valor será sempre numero da pagina * limite. Assim fica fácil automatizar o script.

Outra dica é que, para o Sql Server 2005, o valor do TOP pode ser uma variável ou um parâmetro de Stored Procedure desde que ele seja escrito entra parênteses.

 

Esse truque funciona bem para tabelas pequenas, pois o custo de um ORDER BY é alto.

 

 

--UPDATE

 

Para Sql Server 2005 existe a seguinte solução:

WITH resultado AS
(
	SELECT *, ROW_NUMBER() OVER (ORDER BY coluna) AS linha FROM tabela
)

SELECT * FROM resultado WHERE linha BETWEEN x AND y

Onde x e y são o inicio e o fim da busca. Muito mais rápido do que a primeira solução.

Compartilhar este post


Link para o post
Compartilhar em outros sites

pedro, muito bacana a sintaxe que você postou.

 

Estarei colocando a area de dicas. Com certeza alguem vai precisar ^^

 

Abçs

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.