Duda sobre consulta habitual.

07/02/2007 - 19:45 por Carlos Gómez | Informe spam
Mi duda es la siguiente:

Obtener un numero concreto de registros con un id inferior a uno dado.

Es decir, si tengo una tabla con los siguientes valores:

Id
1
2
4
6
10
11

y yo quiero obtener los 3 registros anteriores al id (2,4 y 6),
entonces hago lo siguiente:

SELECT A.*
FROM Tabla AS A
WHERE A.Id IN
(SELECT TOP 3 Id FROM Tabla
WHERE Id<10
ORDER BY Id DESC)
ORDER BY Id ASC --Si los queremos tener ordenados finalmente

Lo cual me parece un tanto rebuscado.
¡y es una tabla simple, cuando está relacionada y hay que hacer INNER
JOIN, ya me parece una pasada para algo tan habitual!

¿Hay alguna forma más simple?

Preguntas similare

Leer las respuestas

#1 Carlos Sacristan
07/02/2007 - 20:21 | Informe spam
Pues por ejemplo,

SELECT TOP 3 * FROM Tabla WHERE id < 10 ORDER BY Id DESC




"Carlos Gómez" escribió en el mensaje
news:
Mi duda es la siguiente:

Obtener un numero concreto de registros con un id inferior a uno dado.

Es decir, si tengo una tabla con los siguientes valores:

Id
1
2
4
6
10
11

y yo quiero obtener los 3 registros anteriores al id (2,4 y 6),
entonces hago lo siguiente:

SELECT A.*
FROM Tabla AS A
WHERE A.Id IN
(SELECT TOP 3 Id FROM Tabla
WHERE Id<10
ORDER BY Id DESC)
ORDER BY Id ASC --Si los queremos tener ordenados finalmente

Lo cual me parece un tanto rebuscado.
¡y es una tabla simple, cuando está relacionada y hay que hacer INNER
JOIN, ya me parece una pasada para algo tan habitual!

¿Hay alguna forma más simple?
#2 Carlos Gómez
07/02/2007 - 20:52 | Informe spam
On 7 feb, 20:21, "Carlos Sacristan" <nomail> wrote:
Mostrar la cita
Si, pero si los devuelve en un orden que no siempre es el deseado. Mea
Culpa: no me expresé bien al exponer la pregunta
Por ejemplo, tienes un listado que muestra digamos 50 registros del
total, si quieres ver los 50 anteriores o los 50 siguientes, el orden
en que aparezcan es importante. Cuando te mueves hacia adelante, no
hay problema, pero cuando quieres ver los anteriores, el último de los
50 anteriores, debería ser el que va justo antes del primer registro
del listado que tenías
#3 Alejandro Mesa
07/02/2007 - 21:31 | Informe spam
Carlos,

Tambien puedes probar con:

select a.*
from tablaA as A
where A.[id] < 10
and (select count(*) from tablaA as B where B.[id] > A.[id]) < 3
go


En sql server 2005 pudieras usar algo asi como:

declare @id int

set @id = 10

with cte
as
(
select [id], ..., cn, row_number() over(order by [id] desc) as rn
from tablaA
where [id] < 10
)
select *
from cte
where rn < 4
go


AMB

"Carlos Gómez" wrote:

Mostrar la cita
#4 Alejandro Mesa
07/02/2007 - 21:40 | Informe spam
Correccion:

Mostrar la cita
select a.*
from tablaA as A
where A.[id] < 10
and (select count(*) from tablaA as B where B.[id] < 10 and B.[id] > A.[id])
< 3
go


AMB

"Alejandro Mesa" wrote:

Mostrar la cita
#5 Carlos Gómez
08/02/2007 - 06:53 | Informe spam
Muchas gracias, perfecto. Ya me parecia a mi que me estaba liando
Ads by Google
Search Busqueda sugerida