Clausula TOP y rowcount

02/07/2004 - 10:47 por J | Informe spam
Hola a todos!

alguien ha tenido alguna vez que pelearse con la clausula top, del estilo
Select top 100 * from
esto es para obtener los primeros 100 registros,
pero si quiero obtener los 100 siguientes??
existe alguna claúsula similar??

la tabla sobre la que trabajo es horrible (la tabla de traces de sql server)
así que no hay ningún campo ni conjunto de campos que identifiquen
unicamente el registro, por lo que no puedo hacer selects anidados para
obtener los 100 siguientes,
necesito algo parecido al top pero con un rango (en mySQL se llama limit) o
un rowcount (que creo que tampoco existe en sqlserver)

Bueno, espero que alguien me pueda ayudar

un saludo y gracias

Preguntas similare

Leer las respuestas

#11 Javier Loria
05/07/2004 - 18:39 | Informe spam
Hola Guido:
Siento mucho que te aburieras el sabado :(
En principio, antes de discutir la mejor implementacion del "marcianito
repartidor de Id's", debemos buscar la necesidad del mismo. Un caso real (no
necesariamente asociado con BD) que me ocurrio el sabado.
Parqueo mi vehiculo en un Parqueo con una computadora como como caja
registradora y el enanito me asigna el tiquete 37. Vuelvo 4 horas despues y
resulta que segun el software que el 37 ya fue retirado!!!. Yo se que mi
vehiculo esta ahi, lo veo, no se lo han robado, tengo el tiquete 37, pero el
sofware insiste en que el tiquete y el vehiculo ya fueron retirados. Despues
de 10/15 minutos el dependiente se da cuenta que hace 2 horas alguien retiro
el vehiculo asignado al tiquete 37. Como sabe que el tiquete lo tengo yo y
el vehiculo todavia esta en el Parqueo "asume" que fue un error y que en
realidad fue el 36 el que vino hace 2 horas y por error registro el 37.
Finalmente registra el 36 en el sistema me cobra 30 minutos mas (15 de
investigacion y 15 minutos porque el vehiculo anterior entro antes). El
cliente no esta contento, ni el usuario. El problema anterior se reducira
notablemente si en lugar de registrar el Numero del Tiquete es software
exigiera el numero de placa. Corolario: Los enanitos se equivocan.
Muchos de los identities se generan porque los programadores no
distinguen o no buscan llaves primarias naturales. Ejemplo: en el posteo
"Recomendaciones en numero de Campos" de Elena. La mayoria de los novatos de
SQL y una buena cantidad de los expertos ubieran creado una tabla que es:
==CREATE TABLE Enfermedades(
EnfermedaID INT IDENTITY NOT NULL
, NombreEnfermedad VARCHAR(50) NOT NULL
)
Este tipo de tabla es una puerta abierta a los problemas, con frecuencia
despues de algunos anos terminamos con numeros repetidos, ya que el Identity
no garantiza que los numeros de ID no son repetidos y con frecuencia los
usuarios crearan la misma enfermedad varias veces. Adicionalmente este
software es un mundo aparte ya que el identificador no tiene ninguna
relacion con el mundo real y no es de ninguna forma verificable. Normalmente
este problema se le achaca a los usuarios cuando en realidad es la Bd la
responsable del mantenimiento de la integridad.
Por ultimo tengo que reconocer que a veces no existe una llave primaria
o no es posible distinguirla y en este caso lo mejor es "inventarla", si es
asi un numero consecutivo suele ser una de las peores alternativas. La razon
es que es muy facil cometer errores, por eso los bancos y las tarjetas de
credito usas numeros de verificacion.
De las opciones no he requerido de a) Identity excepto cuando construyo
Dimensiones de Almacenes de Datos.
Uso b) unicamente en procesos que por su naturaleza no deben ocurrir
concurrentemente (tipicamente cierres de periodos, nunca en transacciones
frecuentes)
Uso: SELECT COALESCE(MAX(ID), 0)+1 ... FROM ..., cuando no tengo
alternativa. Esta opcion no es mas que un Identity Transaccional y tiene
todos los defectos del Identity excepto que es Transaccional y es compatible
con otros motores de BD.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Guido escribio:
Supongamos q yo elijo la B. pq es sabado y tengo ganas de discutir y
aprender algo (y no de trabajar)

cuales son los pros y contras de estas 3 implementaciones:
a) Identity
b) Id Numérico. Bloquear la tabla cuando se pide un nuevo id hasta q
se agrega el registro
c) Id Numérico. Alta en una transaccion sin bloquear nada
d) Id Numérico. Un marcianito le da el id al sp.

Me gusta la d. El tema es cual es la mejor opcion para hacer el
"marcianito repartidor de Id's ".
¿como lo harian?

Guido.-
Insetec
Argentina


Javier Loria wrote:

Hola Isaias:
Si realmente quieres discutir, tenemos que presentar argumentos
formales o demostraciones a favor y en contra. Si los argumentos
son: yo lo uso y funciona no va a existir discusion :(.
Un ejemplo: durante casi 10 anos fui un fumador de 2 cajetillas
diarias, significa que puede haberme pararme en centro de la plaza y
gritar vean como fumo 40 cigarrillos diarios y no me enfermo!!!.
Espero que estes de acuerdo que ese comportamiento solo haria que
duden de mi sanidad mental. Se me ocurren algunas alternativas:
a) Discutimos sobre el esquema de tus tablas y vemos el efecto
del identity. En cuyo caso tienes que mostrarme el esquema con
columnas, llaves e indices, para poder hacerme una idea..
b) Discutimos teoria general de BD.
c) Lo dejamos pasar y seguimos teniendo escaramusas cada vez que
escribo sobre los identities :D
Si escoges la c), te dire que los Identities son como una vieja
cancion de Bonnie Tyler "It's A Heartache"
=>> It's a heartache
Nothing but a heartache
Hits you when it's too late
Hits you when you're down
=>> Traduccion Libre:
=>> Es una Angustia
Nada mas que una Angustia
Te golpea cuando ya es demasiado tarde
Te golpea cuando estas caido.
>> Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.>> Saludos,

Isaías escribio:
Le entro a la discusion.

Proceso llamadas telefonicas de alto trafico, hasta 4.5
millones de registros por cada media hora, mi PK es un
IDENTITY y no tengo problema alguno.

¿Que tal?
Respuesta Responder a este mensaje
#12 david9922
07/07/2004 - 23:19 | Informe spam
Miren esta consulta q encontre:

RegistrosporPagina
Cantidad de registros que serán retornados en cada solicitud
Universo
La cantidad de registros máxima sobre la que será aplicada la paginación
Tabla
Nombre de la tabla
PaginaActual
Numero de la pagina que se desea retornar
Criterio
Criterio del universo de registros a retornar
CampoID
Es el nombre del campo ID de la tabla
OrdenadoPor
Campo de Ordenacion

SELECT TOP {RegistrosPorPagina} *
FROM (
SELECT TOP {Universo} * FROM {Tabla} WHERE {Criterio}
)
ALIASA
WHERE ALIASA.{CampoID}
NOT IN (
SELECT TOP ( {RegistrosPorPagina} * (1 - {PaginaActual} ) ) {CampoID}
FROM (
SELECT TOP {Universo} * FROM {Tabla} WHERE {Criterio}
)
ALIASB
ORDER BY ALIASB.{OrdeNadoPor}
)
ORDER BY ALIASA.{OrdenadoPor}
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida