Retroceder   Foros del Web > Programación para sitios web > Bases de Datos > SQL Server

Respuesta
 
Herramientas Desplegado
Antiguo 09-may-2008, 08:53   #1 (permalink)
cmarrero está en el buen camino
 
Avatar de cmarrero
 
Fecha de Ingreso: enero-2008
Ubicación: San Luis
Mensajes: 282
Enviar un mensaje por MSN a cmarrero Enviar un mensaje por Yahoo  a cmarrero
Exclamación LIMIT con SQL Server NO EXISTE

HOLA TODOS...

NO EXISTE LIMIT EN SQL SERVER.....(se que no descubri la polvora pero como es la primera vez que uso SQL server, no puedo creer que una cosa tan simple como esa simplemente no exista en SQL server).

Entonces mi problema es hacer una consulta SQL con algo que funcione como el LIMIT de MYSQL.

se me complica mas que nada por que tengo una consulta con INNER JOIN para juntar tablas y etc...

Vi el siguiente ejemplo en otro foro:

Código PHP:
SELECT FROM SELECT *, ROW_NUMBER() OVER (ORDER BY id) as row FROM Base_de_datos ) as alias WHERE row and row <= 12... 
Alguien me puede expliar con este ejemplo como quedaria con la consulta que yo he realizado ya que se me confunde todo con los INNER JOIN que he realizado.. y los condicionales para concatenar la sentencia SQL de mi codigo...

MI CODIGO ES EL SIGUIENTE:

Código PHP:
$dns="ACU";
$conexion odbc_connect("$dns","","","");

$strqry "select a.PIN, a.ACCESS_DATE, a.TYPE, a.ACU_NUMBER, u.USER_CODE, u.USERS_GROUP_ID, u.FIRST_NAME, u.LAST_NAME FROM access a INNER JOIN users u ON u.USER_CODE = a.PIN where 1 = 1";
if (
$fecha_desde !=="" and $fecha_hasta !==""){
$strqry.= "AND a.ACCESS_DATE BETWEEN '$inicio' AND '$fin'";
}
if (
$user_id !=="Apellido y Nombre") {
$strqry.= " AND a.PIN='$user_id'";
}
$strqry.= " ORDER BY u.LAST_NAME ";

$consulta=odbc_exec($conexion,$strqry);
$registros=odbc_num_rows($consulta); 

Perdon por colocarla mesclada con el codigo PHP pero es que la necesito de esa manera, es mas que nada para que me entiendan...

La idea de usar algo como LIMIT es para hacer un paginador...

Saludos y muchas gracias
cmarrero está desconectado   Responder Citando
Antiguo 09-may-2008, 09:39   #2 (permalink)
usuariobaneado sólo puede mejorar
 
Avatar de usuariobaneado
 
Fecha de Ingreso: diciembre-2007
Mensajes: 305
Re: LIMIT con SQL Server NO EXISTE

No se... pero he analizado todo el código php y sql expuesto y no encuentro por ningún lado la palabra LIMIT.

Puedo presumir que es para ponerle un límite de registros a la consulta, lo que en SQL Sever equivale a TOP

SELECT TOP 10 <campo> FROM <Tabla>

El resultado podría ser miles de registros pero como tiene un TOP 10 solo traerá los 10 primeros, el número del top puede variar.
__________________
Yo quiero ser el pelucón del barrio
usuariobaneado está desconectado   Responder Citando
Antiguo 09-may-2008, 12:02   #3 (permalink)
cmarrero está en el buen camino
 
Avatar de cmarrero
 
Fecha de Ingreso: enero-2008
Ubicación: San Luis
Mensajes: 282
Enviar un mensaje por MSN a cmarrero Enviar un mensaje por Yahoo  a cmarrero
Exclamación Re: LIMIT con SQL Server NO EXISTE

te lo explico mejor...

LIMIT N,N existe en MySQL es para tomar por ejemplo del registro 10 al 20, en SQL server esto NO EXISTE.

El TOP N, lo que hace es tomar del registro 0 hasta N que hayas colocado..

No tiene una forma de seleccionar del registro N al registro N..

Entonces, con el codigo que yo expuse quisiera saber como hacer la consulta para poder crear luego un paginador, es decir, como tengo que dejar mi consulta SQL para crear luego un paginador de resultados con SQL server...

Saludos
cmarrero está desconectado   Responder Citando
Antiguo 09-may-2008, 12:11   #4 (permalink)
usuariobaneado sólo puede mejorar
 
Avatar de usuariobaneado
 
Fecha de Ingreso: diciembre-2007
Mensajes: 305
Re: LIMIT con SQL Server NO EXISTE

Ah ya te entiendo. Se produciría el mismo efecto si se tuviera un campo tipo identity y a punta de where podría filtrar los que necesito.

Desconozco como hacerlo en sql server, por allí alguién podría opinar por favor
__________________
Yo quiero ser el pelucón del barrio
usuariobaneado está desconectado   Responder Citando
Antiguo 09-may-2008, 12:15   #5 (permalink)
cmarrero está en el buen camino
 
Avatar de cmarrero
 
Fecha de Ingreso: enero-2008
Ubicación: San Luis
Mensajes: 282
Enviar un mensaje por MSN a cmarrero Enviar un mensaje por Yahoo  a cmarrero
Exclamación Re: LIMIT con SQL Server NO EXISTE

A manotazo de ahogado intente lo siguiente:

Código PHP:

$where
='1';
if (
$fecha_desde !=="" and $fecha_hasta !=="")
  
$where.= " AND a.ACCESS_DATE BETWEEN '$inicio' AND '$fin'";

if (
$user_id !=="Apellido y Nombre")
  
$where.= " AND a.PIN='$user_id'";

$consulta='SELECT PIN, ACCESS_DATE, TYPE, ACU_NUMBER, USER_CODE, USERS_GROUP_ID, FIRST_NAME, LAST_NAME FROM ( SELECT select a.PIN as PIN, a.ACCESS_DATE as ACCESS_DATE, a.TYPE as TYPE, a.ACU_NUMBER as ACU_NUMBER, u.USER_CODE as USER_CODE, u.USERS_GROUP_ID as USERS_GROUP_ID, u.FIRST_NAME as FIRST_NAME, u.LAST_NAME as LAST_NAME,  ROW_NUMBER() OVER (ORDER BY u.LAST_NAME) as row  FROM access as a INNER JOIN users as u ON u.USER_CODE = a.PIN WHERE '$where .') as alias WHERE row > 10 and row < 21 ORDER BY LAST_NAME'
Pero no me funciono...

ALGO TAN SIMPLE COMO LIMIT EN MYSQL NO EXISTE EN SQL SERVER, entonces me pregunto como hacen un paginador de resultados con SQL server sin esta funcion...

Bueno gracias por responder y a ver si un experto puede aportar una solucion gracias....
cmarrero está desconectado   Responder Citando
Antiguo 09-may-2008, 12:24   #6 (permalink)
usuariobaneado sólo puede mejorar
 
Avatar de usuariobaneado
 
Fecha de Ingreso: diciembre-2007
Mensajes: 305
Re: LIMIT con SQL Server NO EXISTE

Yo he desarrollado en .net y sql server, en .net al llenar una grilla hago el select de absolutamente todos los datos, pero el control Datagrid de .net lo configuro para la paginación, eso ya es cuestión de programación en el front end, no es que se lanza un select cada vez que el usuario hace clic en alguna flechita para ir a la derecha o izquierda.


Ya ves... por usar php
__________________
Yo quiero ser el pelucón del barrio
usuariobaneado está desconectado   Responder Citando
Antiguo 09-may-2008, 13:11   #7 (permalink)
cmarrero está en el buen camino
 
Avatar de cmarrero
 
Fecha de Ingreso: enero-2008
Ubicación: San Luis
Mensajes: 282
Enviar un mensaje por MSN a cmarrero Enviar un mensaje por Yahoo  a cmarrero
Exclamación Re: LIMIT con SQL Server NO EXISTE

Bien, con respecto a los diferentes lenguajes de programacion para crear aplicaciones web y etc... siempre hay cosas mejores o peores de acuerdo al lenguaje.. yo se programar en php nada mas... nunca me puse a ver .net..

el tema es mas que nada son los motores de BD, digamos en MySQL es super facil todo, con SQL server tambien es facil muchas cosas de hecho con el SQL server 2005 Express puedo hacer varias cositas que con MySQL no... pero igual, algo que me ha trabajo en este momento es esta pequeña cosa que MySQL lo hace tan simple... como el LIMIT.

Entonces, Vuelvo a preguntar de nuevo, EXISTE DE ALGUNA MANERA CON LENGUAJE SQL DE CONSULTAR DE UNA TABLA LAS FILAS DESDE POR EJEMPLO LA FILA 15 A LA FILA 30.....

SI ES ASI ¡¡¡¡¡ COMO SE HACE !!!...

Gracias igual por responder....
cmarrero está desconectado   Responder Citando
Antiguo 09-may-2008, 14:20   #8 (permalink)
eganya ha deshabilitado el karma
 
Fecha de Ingreso: mayo-2008
Mensajes: 1
De acuerdo Re: LIMIT con SQL Server NO EXISTE

Hola... no recuerdo de que foro saqué la idea pero resulta filete para poder hacer paginación y esas cosas, filtros etc:

si quieren les puedo mandar un resumen del script que genera la siguiente consulta sql, mientras tan solo la query misma:

WITH proyectos AS (
SELECT
ROW_NUMBER() OVER( ORDER BY sitrelmi_coacen_inc.fei ASC ) as Row,
....
columnas_de_diferentes_tablas,
....
FROM
tablas_de_las_columnas
WHERE
condiciones
AND
otras_condiciones
...
ORDER BY
orden necesario
)
SELECT TOP 10 * FROM proyectos WHERE Row > 0

en este caso selecciona los 10 primeros segun el orden que se le da a la query interior, como por ejemplo para filtrar algunas fechas o estados, por poner un ejemplo.
ahora, si quieres seleccionar del 6 al 20 digamos seria asi:


WITH proyectos AS (
SELECT
ROW_NUMBER() OVER( ORDER BY sitrelmi_coacen_inc.fei ASC ) as Row,
....
...
)
SELECT TOP 15 * FROM proyectos WHERE Row > 5

ojala te sirva...
Eganya.
eganya está desconectado   Responder Citando
Antiguo 09-may-2008, 14:21   #9 (permalink)
usuariobaneado sólo puede mejorar
 
Avatar de usuariobaneado
 
Fecha de Ingreso: diciembre-2007
Mensajes: 305
Re: LIMIT con SQL Server NO EXISTE

Lo podrías filtrar por clave primaria. Cual es la primary key de tu tabla?

Lo del lenguaje era solo un comentario suelto, entiendo el centro del asunto que es el select
__________________
Yo quiero ser el pelucón del barrio
usuariobaneado está desconectado   Responder Citando
Antiguo 09-may-2008, 17:44   #10 (permalink)
cmarrero está en el buen camino
 
Avatar de cmarrero
 
Fecha de Ingreso: enero-2008
Ubicación: San Luis
Mensajes: 282
Enviar un mensaje por MSN a cmarrero Enviar un mensaje por Yahoo  a cmarrero
Exclamación Re: LIMIT con SQL Server NO EXISTE

Pense en los ID de la tabla, el problema es si llegan a eliminar una fila, el paginador no funcionaria como corresponde...

Si tenes alguna idea tirala.. gracias
cmarrero está desconectado   Responder Citando
Antiguo 09-may-2008, 21:26   #11 (permalink)
Beakdan está en el buen camino
 
Avatar de Beakdan
 
Fecha de Ingreso: noviembre-2002
Ubicación: México, D.F.
Mensajes: 367
Re: LIMIT con SQL Server NO EXISTE

La forma básica de tu query es ésta:
Código:
SELECT        a.PIN,
            a.ACCESS_DATE,
            a.TYPE,
            a.ACU_NUMBER,
            u.USER_CODE,
            u.USERS_GROUP_ID,
            u.FIRST_NAME,
            u.LAST_NAME
FROM        access AS a
INNER JOIN    users AS u
            ON u.USER_CODE = a.PIN
WHERE        a.ACCESS_DATE BETWEEN ? AND ?
            AND a.PIN = ?
ORDER BY    u.LAST_NAME
Lo que te interesa es numerar las filas del resultado de la consulta anterior. Que la consulta venga de una sola tabla o de joins no es importante para asignarles a las filas un número de orden. Incluso, aún cuando no tuvieras una columna o columnas en las cuales ordenar los resultados aún así pueden ser numerados los registros.
Código:
SELECT        *
FROM        (
                SELECT        ROW_NUMBER() OVER(ORDER BY u.LAST_NAME) AS rn,
                            a.PIN,
                            a.ACCESS_DATE,
                            a.TYPE,
                            a.ACU_NUMBER,
                            u.USER_CODE,
                            u.USERS_GROUP_ID,
                            u.FIRST_NAME,
                            u.LAST_NAME
                FROM        access AS a
                INNER JOIN    users AS u
                            ON u.USER_CODE = a.PIN
                WHERE        a.ACCESS_DATE BETWEEN ? AND ?
                            AND a.PIN = ?
            ) AS sub
WHERE        rn >= 10 AND rn <= 20
En caso de no tener columnas de orden, puedes usar algo como:
Código:
ROW_NUMBER() OVER(ORDER BY (SELECT 1))
Sin embargo, lo anterior no es determinístico y es probable que aún para los mismos límites no devuelva lo mismo.
Como puedes ver es realmente sencillo. Sólo que en este momento estás acostumbrado a la forma de MySQL, que como ya te había comentado, ni siquiera es estándar. Las funciones de ranking como ROW_NUMBER() en cambio sí lo es (SQL2003).
Beakdan está desconectado   Responder Citando
Antiguo 09-may-2008, 21:38   #12 (permalink)
Beakdan está en el buen camino
 
Avatar de Beakdan
 
Fecha de Ingreso: noviembre-2002
Ubicación: México, D.F.
Mensajes: 367
Re: LIMIT con SQL Server NO EXISTE

Analizando la consulta que habías obtenido, el error es que escribiste:
Código:
SELECT select a.PIN as PIN
Pero además, al indicar el orden en la cláusula OVER(), no es necesario el order by al final de la consulta. Puede parecer confuso, pero en casos donde la función usa tambien PARTITION BY, el order by al final de la consulta problemente devuelva los numeros de secuencia desordenados.
Beakdan está desconectado   Responder Citando
Antiguo 10-may-2008, 05:57   #13 (permalink)
cmarrero está en el buen camino
 
Avatar de cmarrero
 
Fecha de Ingreso: enero-2008
Ubicación: San Luis
Mensajes: 282
Enviar un mensaje por MSN a cmarrero Enviar un mensaje por Yahoo  a cmarrero
Exclamación Re: LIMIT con SQL Server NO EXISTE

Es excelente, me sirve a la perfeccion, me cuesta mucho entender las sub consultas... perobueno, estoy en eso...

Gracias por respodner...
cmarrero está desconectado   Responder Citando
Respuesta

Calificación: Calificación de Tema: 1 votos, 5,00 de promedio.


Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder temas
No puedes subir archivos adjuntos
No puedes editar tus mensajes

BB code is Activado
Caritas están Activado
[IMG] está Activado
Código HTML está Desactivado


La Zona horaria es GMT -6. Ahora son las 02:04.


Message Board Statistics

LinkBacks Enabled by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93