Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

LIMIT con SQL Server NO EXISTE

Estas en el tema de LIMIT con SQL Server NO EXISTE en el foro de SQL Server en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 09/05/2008, 08:53
(Desactivado)
 
Fecha de Ingreso: enero-2008
Ubicación: Mendoza
Mensajes: 458
Antigüedad: 16 años, 2 meses
Puntos: 2
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
  #2 (permalink)  
Antiguo 09/05/2008, 09:39
Avatar de usuariobaneado  
Fecha de Ingreso: diciembre-2007
Mensajes: 402
Antigüedad: 16 años, 4 meses
Puntos: 5
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
  #3 (permalink)  
Antiguo 09/05/2008, 12:02
(Desactivado)
 
Fecha de Ingreso: enero-2008
Ubicación: Mendoza
Mensajes: 458
Antigüedad: 16 años, 2 meses
Puntos: 2
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
  #4 (permalink)  
Antiguo 09/05/2008, 12:11
Avatar de usuariobaneado  
Fecha de Ingreso: diciembre-2007
Mensajes: 402
Antigüedad: 16 años, 4 meses
Puntos: 5
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
  #5 (permalink)  
Antiguo 09/05/2008, 12:15
(Desactivado)
 
Fecha de Ingreso: enero-2008
Ubicación: Mendoza
Mensajes: 458
Antigüedad: 16 años, 2 meses
Puntos: 2
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....
  #6 (permalink)  
Antiguo 09/05/2008, 12:24
Avatar de usuariobaneado  
Fecha de Ingreso: diciembre-2007
Mensajes: 402
Antigüedad: 16 años, 4 meses
Puntos: 5
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
  #7 (permalink)  
Antiguo 09/05/2008, 13:11
(Desactivado)
 
Fecha de Ingreso: enero-2008
Ubicación: Mendoza
Mensajes: 458
Antigüedad: 16 años, 2 meses
Puntos: 2
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....
  #8 (permalink)  
Antiguo 09/05/2008, 14:20
 
Fecha de Ingreso: mayo-2008
Mensajes: 1
Antigüedad: 15 años, 11 meses
Puntos: 0
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.
  #9 (permalink)  
Antiguo 09/05/2008, 14:21
Avatar de usuariobaneado  
Fecha de Ingreso: diciembre-2007
Mensajes: 402
Antigüedad: 16 años, 4 meses
Puntos: 5
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
  #10 (permalink)  
Antiguo 09/05/2008, 17:44
(Desactivado)
 
Fecha de Ingreso: enero-2008
Ubicación: Mendoza
Mensajes: 458
Antigüedad: 16 años, 2 meses
Puntos: 2
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
  #11 (permalink)  
Antiguo 09/05/2008, 21:26
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
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).
  #12 (permalink)  
Antiguo 09/05/2008, 21:38
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
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.
  #13 (permalink)  
Antiguo 10/05/2008, 05:57
(Desactivado)
 
Fecha de Ingreso: enero-2008
Ubicación: Mendoza
Mensajes: 458
Antigüedad: 16 años, 2 meses
Puntos: 2
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...
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 07:43.