none
unir resultados de dos tablas y paginacion RRS feed

  • Pregunta

  • Hola.

    De un post anterior sobre cómo poder unir los resultados de dos tablas, me han dado esta solución, que funciona perfectamente:

    select d.id, d.definicion, f.id_definicion
    from DEFINICIONES as d inner join FAVORITOS as f
    on d.id=f.id_definicion
    where f.nick='Miguel'

    (En la tabla FAVORITOS está el id de la definicion y el nick de quien lo seleccionó como favorito)

    y de otro lugar, he encontrado esta sentencia, la cual me permite ir "paginando" resultados obtenidos de una tabla, mostrando del 1-10, 11-20, etc...  (en este caso me muestra las definiciones de la 11 a la 20):

    SELECT definicion FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY definicion) AS row 
    FROM FAVORITOS WHERE nick = 'Miguel') AS FAVORITOS WHERE row >= 11 AND row <= 20

    El caso es, cómo puedo unir ambas sentencias?

    Es decir, un usuario puede tener 15 definiciones favoritas, y me gustaría primero poder mostrar las 10 primeras, y cuando cambia de pagina, mostrar de la 11 a la 20 (aunque solo se muestren 5).

    Si hay otra forma más sencilla, también me vale xD.

    Saludos!

    martes, 30 de octubre de 2012 12:42

Respuestas

  • No dices qué versión de SQL Server estás usando. Si fuera 2012 tienes una forma de paginar más sencilla, pero si no es así, usar ROW_NUMBER es probablemente la mejor opción (si quieres paginar desde el servidor y no directamente en tu aplicación cliente)

    La forma de unir esas dos sentencias es fácil. Puedes hacerlo mediante una CTE o de la forma que te han enseñado, eso como veas

    -- con CTE, más limpio
    ; WITH datos AS
    (
    select d.id, d.definicion, f.id_definicion
    , ROW_NUMBER() OVER(ORDER BY d.definicion) AS rn
    from DEFINICIONES as d inner join FAVORITOS as f
    on d.id=f.id_definicion
    where f.nick='Miguel'
    )
    SELECT id, definicion, id_definicion
    FROM datos
    WHERE rn BETWEEN <inicio> AND <fin>
    
    -- o sin CTE
    SELECT id, definicion, id_definicion
    FROM (select d.id, d.definicion, f.id_definicion
    , ROW_NUMBER() OVER(ORDER BY d.definicion) AS rn
    from DEFINICIONES as d inner join FAVORITOS as f
    on d.id=f.id_definicion
    where f.nick='Miguel') datos
    WHERE rn BETWEEN <inicio> AND <fin>

    • Marcado como respuesta Miguel 09 martes, 30 de octubre de 2012 14:43
    martes, 30 de octubre de 2012 13:09

Todas las respuestas

  • No dices qué versión de SQL Server estás usando. Si fuera 2012 tienes una forma de paginar más sencilla, pero si no es así, usar ROW_NUMBER es probablemente la mejor opción (si quieres paginar desde el servidor y no directamente en tu aplicación cliente)

    La forma de unir esas dos sentencias es fácil. Puedes hacerlo mediante una CTE o de la forma que te han enseñado, eso como veas

    -- con CTE, más limpio
    ; WITH datos AS
    (
    select d.id, d.definicion, f.id_definicion
    , ROW_NUMBER() OVER(ORDER BY d.definicion) AS rn
    from DEFINICIONES as d inner join FAVORITOS as f
    on d.id=f.id_definicion
    where f.nick='Miguel'
    )
    SELECT id, definicion, id_definicion
    FROM datos
    WHERE rn BETWEEN <inicio> AND <fin>
    
    -- o sin CTE
    SELECT id, definicion, id_definicion
    FROM (select d.id, d.definicion, f.id_definicion
    , ROW_NUMBER() OVER(ORDER BY d.definicion) AS rn
    from DEFINICIONES as d inner join FAVORITOS as f
    on d.id=f.id_definicion
    where f.nick='Miguel') datos
    WHERE rn BETWEEN <inicio> AND <fin>

    • Marcado como respuesta Miguel 09 martes, 30 de octubre de 2012 14:43
    martes, 30 de octubre de 2012 13:09
  • Muchas gracias Carlos, ha funcionado perfectamente.

    Se me había olvidado, era para la versión 2008.

    Saludos!!

    martes, 30 de octubre de 2012 14:45