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?
Respuesta Responder a este mensaje
#2 Carlos Gómez
07/02/2007 - 20:52 | Informe spam
On 7 feb, 20:21, "Carlos Sacristan" <nomail> wrote:
Pues por ejemplo,

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



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
Respuesta Responder a este mensaje
#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:

On 7 feb, 20:21, "Carlos Sacristan" <nomail> wrote:
> Pues por ejemplo,
>
> SELECT TOP 3 * FROM Tabla WHERE id < 10 ORDER BY Id DESC
>
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



Respuesta Responder a este mensaje
#4 Alejandro Mesa
07/02/2007 - 21:40 | Informe spam
Correccion:

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



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:

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:

> On 7 feb, 20:21, "Carlos Sacristan" <nomail> wrote:
> > Pues por ejemplo,
> >
> > SELECT TOP 3 * FROM Tabla WHERE id < 10 ORDER BY Id DESC
> >
> 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
>
>
>
Respuesta Responder a este mensaje
#5 Carlos Gómez
08/02/2007 - 06:53 | Informe spam
Muchas gracias, perfecto. Ya me parecia a mi que me estaba liando
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida