WHERE con posición ordinal ...

14/01/2004 - 10:27 por Toni Rom | Informe spam
Tengo una tabla con millones de registros. Quiero acceder
a un conjunto de ellos de los cuales sólo conozco su
posición ordinal.

Querría realizar un recordset con sólo estos registros. O
sea, no me interesa cargar un recordset con todo y luego
acceder con, por ejemplo GetAbsolutePosition(), al rango
de registros requerido.

Algo similar a poder usar un Recno() de Dbase dentro de
la sentencia Where de creación del Recordset de datos.

Alguien sabe algo al respecto o tiene solucionado este
problema de manera similar.

Gracias de antemano.

Toni.

Preguntas similare

Leer las respuestas

#1 Carlos Sacristan
14/01/2004 - 11:23 | Informe spam
No existe ninguna función en SQL Server que te devuelva directamente el
número que ocupa un determinado registro dentro de un conjunto de
resultados. Para eso hay determinados trucos (crear una tabla de resultados
con un identity y preguntar por él como ese identificador), pero en una
tabla de millones de registros puede resultar demasiado costoso.

¿No tienes forma de preguntar por un registro a través de algún campo
único?


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

Por favor, responder únicamente al foro
Se agradece la inclusión de sentencias DDL


"Toni Rom" escribió en el mensaje
news:078701c3da80$92e228b0$
Tengo una tabla con millones de registros. Quiero acceder
a un conjunto de ellos de los cuales sólo conozco su
posición ordinal.

Querría realizar un recordset con sólo estos registros. O
sea, no me interesa cargar un recordset con todo y luego
acceder con, por ejemplo GetAbsolutePosition(), al rango
de registros requerido.

Algo similar a poder usar un Recno() de Dbase dentro de
la sentencia Where de creación del Recordset de datos.

Alguien sabe algo al respecto o tiene solucionado este
problema de manera similar.

Gracias de antemano.

Toni.
Respuesta Responder a este mensaje
#2 Manuel \(Salamanca\)
14/01/2004 - 11:25 | Informe spam
Hola Toni,
yo lo haría de la siguiente forma pero seguro que algún compañero tiene
mejores soluciones,


SELECT Top @Var1 *
FROM Tabla1
WHERE IdTabla1 NOT IN (SELECT Top @Var2 IdTabla1 FROM Tabla1 ORDER BY Fecha)
ORDER BY Fecha

Teniendo en cuenta que:
@Var1 = numero de registros que quieres obtener
@Var2 = a partir de que registro quieres empezar a obtener
Orderna las dos select por el mismo criterio

Espero que te sirva


Saludos.


"Toni Rom" escribió en el mensaje
news:078701c3da80$92e228b0$
Tengo una tabla con millones de registros. Quiero acceder
a un conjunto de ellos de los cuales sólo conozco su
posición ordinal.

Querría realizar un recordset con sólo estos registros. O
sea, no me interesa cargar un recordset con todo y luego
acceder con, por ejemplo GetAbsolutePosition(), al rango
de registros requerido.

Algo similar a poder usar un Recno() de Dbase dentro de
la sentencia Where de creación del Recordset de datos.

Alguien sabe algo al respecto o tiene solucionado este
problema de manera similar.

Gracias de antemano.

Toni.
Respuesta Responder a este mensaje
#3 Miguel Egea
14/01/2004 - 11:55 | Informe spam
Hola manuel, eso funciona muy bien en tablas pequeñas, en selecciones de
millones de registros el proceso podría generar fuertes bloqueos y ser
tremendamente costoso.
La opción de carlos creo que puede ser muy adecuada.

Saludos
Miguel EGea
"Manuel (Salamanca)" escribió en el mensaje
news:
Hola Toni,
yo lo haría de la siguiente forma pero seguro que algún compañero tiene
mejores soluciones,


SELECT Top @Var1 *
FROM Tabla1
WHERE IdTabla1 NOT IN (SELECT Top @Var2 IdTabla1 FROM Tabla1 ORDER BY


Fecha)
ORDER BY Fecha

Teniendo en cuenta que:
@Var1 = numero de registros que quieres obtener
@Var2 = a partir de que registro quieres empezar a obtener
Orderna las dos select por el mismo criterio

Espero que te sirva


Saludos.


"Toni Rom" escribió en el mensaje
news:078701c3da80$92e228b0$
Tengo una tabla con millones de registros. Quiero acceder
a un conjunto de ellos de los cuales sólo conozco su
posición ordinal.

Querría realizar un recordset con sólo estos registros. O
sea, no me interesa cargar un recordset con todo y luego
acceder con, por ejemplo GetAbsolutePosition(), al rango
de registros requerido.

Algo similar a poder usar un Recno() de Dbase dentro de
la sentencia Where de creación del Recordset de datos.

Alguien sabe algo al respecto o tiene solucionado este
problema de manera similar.

Gracias de antemano.

Toni.


Respuesta Responder a este mensaje
#4 Maximiliano D. A.
14/01/2004 - 13:22 | Informe spam
Mira, yo como truco en todas las tablas tengo un Campo identity que me ayuda
mucho a hacer estas cosas, solo lo uso para eso ;)

Salu2

Maximiliano Damian Accotto


"Toni Rom" escribió en el mensaje
news:078701c3da80$92e228b0$
Tengo una tabla con millones de registros. Quiero acceder
a un conjunto de ellos de los cuales sólo conozco su
posición ordinal.

Querría realizar un recordset con sólo estos registros. O
sea, no me interesa cargar un recordset con todo y luego
acceder con, por ejemplo GetAbsolutePosition(), al rango
de registros requerido.

Algo similar a poder usar un Recno() de Dbase dentro de
la sentencia Where de creación del Recordset de datos.

Alguien sabe algo al respecto o tiene solucionado este
problema de manera similar.

Gracias de antemano.

Toni.
Respuesta Responder a este mensaje
#5 Maximiliano D. A.
14/01/2004 - 15:32 | Informe spam
Es verdad, no hay soluciones magicas no? pero a mi me ha sido de mucha
utilidad este truco y lo aplique en todas las tablas no solo para ello sino
hasta para buscar registros mas facil

por ej:

hay una tabla que tenemos que 5 campos hacen de clave no, imaginate escribir
todo eso en un update jeje, por lo cual si conoces el rowid (mi campo
identity) la cosa se transforma en muy simple y rapido a la vez ;)

Salu2


Maximiliano Damian Accotto


"Adrian Garcia" escribió en el mensaje
news:uE5$
Si, esta opcion es buena, pero hay que tener en cuenta que puede llegar a
haber agujeros entre los numeros que genera el identity.

Si tuvieses un identity podrias seleccionar un rango de filas asi:

SELECT * FROM <<tabla>>
WHERE id BETWEEN @nroreg AND @nroreg + @cantreg

donde id es la columna identity, @nroreg el nro. de fila que quieres


generar
y @cantreg la cantidad de filas que deseas traer.
Repito: esta opcion no es perfecta ya que puede haber huecos en las filas
provocados por DELETE's y por transacciones fallidas, trayendo una


cantidad
menor de filas que las esperadas.
Por otro lado esta opcion es muchisimo mas eficiente que utilizar la
sentencia TOP (en varios ordenes de magnitud) siempre y cuando tenga un
indice cluster (eso seria lo ideal) por esa columna. La sentencia TOP hace
que SQL Server, en este caso, procese las millones filas solo para luego
obtener las primeras n filas que le asignes. Este problema se agrrava si


la
sentencia tiene una clausula de ordenamiento!.


Saludos
Adrian D. Garcia


"Maximiliano D. A." <maxi_accotto[arroba]speedy[.]com[.]ar> wrote in


message
news:
> Mira, yo como truco en todas las tablas tengo un Campo identity que me
ayuda
> mucho a hacer estas cosas, solo lo uso para eso ;)
>
> Salu2
>
> Maximiliano Damian Accotto
>
>
> "Toni Rom" escribió en el mensaje
> news:078701c3da80$92e228b0$
> Tengo una tabla con millones de registros. Quiero acceder
> a un conjunto de ellos de los cuales sólo conozco su
> posición ordinal.
>
> Querría realizar un recordset con sólo estos registros. O
> sea, no me interesa cargar un recordset con todo y luego
> acceder con, por ejemplo GetAbsolutePosition(), al rango
> de registros requerido.
>
> Algo similar a poder usar un Recno() de Dbase dentro de
> la sentencia Where de creación del Recordset de datos.
>
> Alguien sabe algo al respecto o tiene solucionado este
> problema de manera similar.
>
> Gracias de antemano.
>
> Toni.
>
>


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida