Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   SQL Server (http://www.forosdelweb.com/f87/)
-   -   LIMIT con SQL Server NO EXISTE (http://www.forosdelweb.com/f87/limit-con-sql-server-no-existe-584625/)

cmarrero 09/05/2008 08:53

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

usuariobaneado 09/05/2008 09:39

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.

cmarrero 09/05/2008 12:02

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

usuariobaneado 09/05/2008 12:11

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

cmarrero 09/05/2008 12:15

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....

usuariobaneado 09/05/2008 12:24

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 ;-)

cmarrero 09/05/2008 13:11

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....

eganya 09/05/2008 14:20

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.

usuariobaneado 09/05/2008 14:21

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 :arriba:

cmarrero 09/05/2008 17:44

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

Beakdan 09/05/2008 21:26

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 09/05/2008 21:38

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.

cmarrero 10/05/2008 05:57

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...


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

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.