SQL - Selecionar Range a partir de um ID

17/02/2020

0

Preciso de um select que me retorne os X registros depois do registro de ID = Y, respeitando o order by NOME.

Exemplificando.

Objetivo: Quero 5 registros depois do ID 54;

Resultado:

74 - Antonio Figueredo Lemos

76 - Cristiane Santos Silva

59 - Eliane Martins Ribeiro

58 - Elson Alves Pereira

64 - Fagna Feliciano da Silva

Alguém me ajuda?

Image de exemplo: https://i.stack.imgur.com/S5H6t.png
Joao

Joao

Responder

Post mais votado

18/02/2020

pode ser assim, se você sabe a partir de qual linha deseja apresentar os registros:
SELECT FIRST 3 -- AQUI VOCÊ INDICA QUANTOS REGISTROS QUER APRESENTAR
	TAB.ID, TAB.NOME
FROM (
SELECT
	(SELECT COUNT(T2.NOME) FROM TABELA T2 WHERE T2.NOME <= T.NOME) LINHA,
	T.ID, T.NOME
FROM
	TABELA T
ORDER BY
	T.NOME
) TAB
WHERE TAB.LINHA >= 3 -- AQUI VOCÊ INDICA A PARTIR DE QUAL LINHA QUER APRESENTAR

ou assim, se você não sabe o número da linha e tem somente o ID:
SELECT FIRST 3 -- AQUI VOCÊ INDICA QUANTOS REGISTROS QUER APRESENTAR
	TAB.ID, TAB.NOME
FROM (
SELECT
	(SELECT COUNT(T2.NOME) FROM TABELA T2 WHERE T2.NOME <= T.NOME) LINHA,
	T.ID, T.NOME
FROM
	TABELA T
ORDER BY
	T.NOME
) TAB
WHERE TAB.LINHA >= 
	(SELECT T3.LINHA FROM (
		SELECT
			(SELECT COUNT(T2.NOME) FROM TABELA T2 WHERE T2.NOME <= T.NOME) LINHA,
			T.ID, T.NOME
		FROM
			TABELA T
		ORDER BY
			T.NOME
		) T3
	WHERE T3.ID = 76) -- AQUI VOCÊ INDICA O ID QUE QUER USAR COMO FILTRO

Emerson Nascimento

Emerson Nascimento
Responder

Mais Posts

17/02/2020

Emerson Nascimento

Firebird
SELECT FIRST 5 * 
FROM TABELA
WHERE ID > 54
ORDER BY NOME

SQL Server
SELECT TOP 5 * 
FROM TABELA
WHERE ID > 54
ORDER BY NOME
Responder

17/02/2020

Joao

Firebird
SELECT FIRST 5 * 
FROM TABELA
WHERE ID > 54
ORDER BY NOME

SQL Server
SELECT TOP 5 * 
FROM TABELA
WHERE ID > 54
ORDER BY NOME


Agradeço pela resposta Emerson, porém esse select não funciona. No caso desse resultado aqui:

74 - Antonio Figueredo Lemos

76 - Cristiane Santos Silva

59 - Eliane Martins Ribeiro

58 - Elson Alves Pereira

64 - Fagna Feliciano da Silva

O select só ia pegar os IDs menores que 54, ou seja ia eliminar todos os registros acima.

Responder

17/02/2020

Emerson Nascimento

você testou?

porque a condição diz pra pegar os registros cujo ID seja MAIOR que 54, então não entendi quando você diz que
O select só ia pegar os IDs menores que 54, ou seja ia eliminar todos os registros acima
Responder

17/02/2020

Joao

você testou?

porque a condição diz pra pegar os registros cujo ID seja MAIOR que 54, então não entendi quando você diz que
O select só ia pegar os IDs menores que 54, ou seja ia eliminar todos os registros acima


Ah, perfeito, saquei! Porém mesmo assim ainda não dá, porque pode ter um registro que tenha o ID menor que 54 mas que faça parte do resultado por estar em ordem alfabética, logo será eliminado :/

Por exemplo:

Essa é a ordenação por NOME

76 - Cristiane Santos Silva
59 - Eliane Martins Ribeiro
58 - Elson Alves Pereira
64 - Fagna Feliciano da Silva

Caso eu queira os 3 registros depois do ID 76, o resultado seria esse:

59 - Eliane Martins Ribeiro
58 - Elson Alves Pereira
64 - Fagna Feliciano da Silva

Porém com seu código ele eliminaria todos esses, pois todos os ID são menores que 76.
Responder

17/02/2020

Emerson Nascimento

Ah... Agora entendi tua necessidade. Peraí que vou pensar em algo.
Responder

18/02/2020

Emerson Nascimento

no lugar de
(SELECT COUNT(T2.NOME) FROM TABELA T2 WHERE T2.NOME <= T.NOME) LINHA,

você pode colocar
ROW_NUMBER() OVER (ORDER BY T.NOME) LINHA,
Responder

20/02/2020

Joao

no lugar de
(SELECT COUNT(T2.NOME) FROM TABELA T2 WHERE T2.NOME <= T.NOME) LINHA,

você pode colocar
ROW_NUMBER() OVER (ORDER BY T.NOME) LINHA,


Agora deu certo, muito obrigado amigo :D
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar