Ir al contenido



Foto

Seleccionar últimos registros de una Tabla


  • Por favor identifícate para responder
30 respuestas en este tema

#21 Delphius

Delphius

    Advanced Member

  • Administrador
  • 5.982 mensajes
  • LocationArgentina

Escrito 03 septiembre 2014 - 01:56

Bueno, tuve que hacerle unos retoques finales. Parece que 2010 tiene sus cosillas respecto al 2013 con el tema de los corchetes en los JOINS y WHERE. Pero ya quedó.
La consulta final adaptada, para efectivamente recuperar la fecha apropiadamente es no ir por el máximo ID sino de la Fecha.

El monstruo que espero no tener que volver a nunca más en mi vida es:



sql
  1. SELECT TablaExptes.ExpteCod, TablaExptes.ExpteNro, TablaExptes.Descripción, TablaEstadosExpte.Nombre, TablaMovimientosExptes.FechaRevision
  2. FROM TablaEstadosExpte INNER JOIN (TablaExptes INNER JOIN TablaMovimientosExptes ON TablaExptes.[IdExpte] = TablaMovimientosExptes.[ExpteID]) ON TablaEstadosExpte.[IDEstado] = TablaMovimientosExptes.[EstadoID]
  3.  
  4. WHERE TablaMovimientosExptes.[FechaRevision] IN(SELECT MAX(TablaMovimientosExptes.[FechaRevision])
  5. FROM TablaMovimientosExptes
  6. GROUP BY TablaMovimientosExptes.ExpteID;);



Gracias Wilson. Me voy a tener que poner a estudiar y repasar SQL porque estoy por demás oxidado. Es casi un año sin tocar algo siquiera de programación. Mucho tiempo perdido.  :(

Saludos,
  • 0

#22 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.135 mensajes

Escrito 03 septiembre 2014 - 02:08

para efectivamente recuperar la fecha apropiadamente es no ir por el máximo ID sino de la Fecha.


Me alegra que resolviste el problema, yo me incliné por el máximo Id,  pensando en la remota posibilidad de que un expediente sea modificado más de una vez en una misma fecha.

El monstruo que espero no tener que volver a nunca más en mi vida


Si, el generador de consultas de  Access crea los INNER JOIN de una manera un tanto exótica.

Saludos.
  • 0

#23 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 03 septiembre 2014 - 02:31

....

Gracias Wilson. Me voy a tener que poner a estudiar y repasar SQL porque estoy por demás oxidado. Es casi un año sin tocar algo siquiera de programación. Mucho tiempo perdido.  :(

Saludos,


Y si pudieras olvidarte de Access... mejor !  :D :D :D :p :p :p

Saludox ! :)
  • 0

#24 Delphius

Delphius

    Advanced Member

  • Administrador
  • 5.982 mensajes
  • LocationArgentina

Escrito 03 septiembre 2014 - 03:12

Y si pudieras olvidarte de Access... mejor !  :D :D :D :p :p :p

Saludox ! :)

Guarda que Caral está vigilando...  :D

Es que la actividad a la que se pretende darle uso no merece gastar en más. Además ten en cuenta de que no tengo mis herramientas de trabajo como para desarrollar un sistema como la gente. Si quiere más, que me lo pague... y al paso que vamos... parece ser cada muerte de obizpo. Si se resiste a devolverme lo que con esfuerzo me he ganado estoy decidido a ir a por medios legales e incluso a pedir daños morales y emocionales (que hay que tener cabeza para aguantar un tipo tan detestable). Por que la cosa no da para más.  :@

Saludos,
  • 0

#25 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.648 mensajes
  • LocationMéxico

Escrito 03 septiembre 2014 - 04:07


....

Gracias Wilson. Me voy a tener que poner a estudiar y repasar SQL porque estoy por demás oxidado. Es casi un año sin tocar algo siquiera de programación. Mucho tiempo perdido.  :(

Saludos,


Y si pudieras olvidarte de Access... mejor !  :D :D :D :p :p :p

Saludox ! :)


Y de ZEOS, joderrrrrr, que tengo un mega pedo por culpa de esos putos componentes  (li) :@ 8o|

Estoy a punto de quitarlos de una vez  :dmad:

Saludos
  • 0

#26 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 03 septiembre 2014 - 05:04



....

Gracias Wilson. Me voy a tener que poner a estudiar y repasar SQL porque estoy por demás oxidado. Es casi un año sin tocar algo siquiera de programación. Mucho tiempo perdido.  :(

Saludos,


Y si pudieras olvidarte de Access... mejor !  :D :D :D :p :p :p

Saludox ! :)


Y de ZEOS, joderrrrrr, que tengo un mega pedo por culpa de esos putos componentes  (li) :@ 8o|

Estoy a punto de quitarlos de una vez  :dmad:

Saludos


Como dice Nike: JUST DO IT !!!  (y)

Saludox ! :)
  • 0

#27 FerCastro

FerCastro

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 618 mensajes
  • LocationCiudad de México

Escrito 04 septiembre 2014 - 01:21


Y de ZEOS, joderrrrrr, que tengo un mega pedo por culpa de esos putos componentes  (li) :@ 8o|

Estoy a punto de quitarlos de una vez  :dmad:

Saludos



www.devart.com

Saludos e-go!!!
  • 0

#28 Delphius

Delphius

    Advanced Member

  • Administrador
  • 5.982 mensajes
  • LocationArgentina

Escrito 08 septiembre 2014 - 09:39

Y de ZEOS, joderrrrrr, que tengo un mega pedo por culpa de esos putos componentes  (li) :@ 8o|

Estoy a punto de quitarlos de una vez  :dmad:

Saludos

Yo a esos componentes hasta la fecha no tuve que tocarlos.  :D No escupo tanto para arriba porque ahora que en esta semana, ¡por fin!, me voy a comprar la PC e instale Linux, Lazarus y Firebird no se si usaré los componentes por defecto que tiene o deberé armarme de valor y emplear Zeos.

Ahora, volviendo al hilo... me pregunto si lo des-resuelto o inicio otro  8o| ... Ahora resulta que necesito una consulta con un giro de 160°: Debo obtener aquellos expedientes que no tienen ningún movimientos, o bien (y/o), que no hayan tenido movimientos desde cierta fecha dada por parámetro.  8o|

Como dice la frase, Oh, y ahora quien podrá ayudarme... ¿Wilson el chapulin SQLizado?  :D

Saludos,
  • 0

#29 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.135 mensajes

Escrito 08 septiembre 2014 - 01:02


Debo obtener aquellos expedientes que no tienen ningún movimientos.


Así a ojo porque no tengo access a mano, sería:



SELECT TablaExptes.ExpteCod, TablaExptes.ExpteNro, TablaExptes.Descripción, TablaEstadosExpte.Nombre, TablaMovimientosExptes.FechaRevision
FROM TablaEstadosExpte INNER JOIN (TablaExptes INNER JOIN TablaMovimientosExptes ON TablaExptes.[IdExpte] = TablaMovimientosExptes.[ExpteID]) ON TablaEstadosExpte.[IDEstado] = TablaMovimientosExptes.[EstadoID]

WHERE TablaExptes.[IdExpte] NOT IN(SELECT TablaMovimientosExptes.[ExpteID] FROM TablaMovimientosExptes;);



o bien (y/o), que no hayan tenido movimientos desde cierta fecha dada por parámetro.




SELECT TablaExptes.ExpteCod, TablaExptes.ExpteNro, TablaExptes.Descripción, TablaEstadosExpte.Nombre, TablaMovimientosExptes.FechaRevision
FROM TablaEstadosExpte INNER JOIN (TablaExptes INNER JOIN TablaMovimientosExptes ON TablaExptes.[IdExpte] = TablaMovimientosExptes.[ExpteID]) ON TablaEstadosExpte.[IDEstado] = TablaMovimientosExptes.[EstadoID]

WHERE TablaExptes.[IdExpte] NOT IN(SELECT TablaMovimientosExptes.[ExpteID] FROM TablaMovimientosExptes WHERE TablaMovimientosExptes.FechaRevision >= [PARAMETRO];);


Saludos.
  • 0

#30 Delphius

Delphius

    Advanced Member

  • Administrador
  • 5.982 mensajes
  • LocationArgentina

Escrito 08 septiembre 2014 - 01:42

Gracias Wilson,  :)
te agradezco la enorme ayuda que me has dado. En cuanto tenga tiempo de poner a prueba la consulta lo veo. Estuve pensando en como encararla mientras hacía mis trámites del día, y en lo primero que me dije es emplear el NOT IN SELECT tal como en tu ejemplo.

Saludos,
  • 0

#31 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.135 mensajes

Escrito 08 septiembre 2014 - 03:01

Gracias Wilson,  :)
te agradezco la enorme ayuda que me has dado. En cuanto tenga tiempo de poner a prueba la consulta lo veo. Estuve pensando en como encararla mientras hacía mis trámites del día, y en lo primero que me dije es emplear el NOT IN SELECT tal como en tu ejemplo.

Saludos,

Ya con access a la mano veo que hay que hacer pequeños cambios, hay que hacer uso de DISTINCT y prescindir de los campos que generen expedientes repetidos.


SELECT DISTINCT TablaExptes.[IdExpte], TablaExptes.ExpteCod, TablaExptes.ExpteNro, TablaExptes.Descripción
FROM TablaExptes  INNER JOIN TablaMovimientosExptes ON TablaExptes.[IdExpte] = TablaMovimientosExptes.[ExpteID]

WHERE TablaExptes.[IdExpte] NOT IN(SELECT TablaMovimientosExptes.[ExpteID] FROM TablaMovimientosExptes;);


La segunda se puede hacer incluso un poco más eficiente así:


SELECT DISTINCT TablaExptes.[IdExpte], TablaExptes.ExpteCod, TablaExptes.ExpteNro, TablaExptes.Descripción
FROM TablaExptes  INNER JOIN TablaMovimientosExptes ON TablaExptes.[IdExpte] = TablaMovimientosExptes.[ExpteID]
WHERE  ((Not (TablaMovimientosExptes.FechaRevision)>=[PARAMETRO]));


Si necesitas que en estas consultas aparezcan el último estado y la última fecha de revisión, no hay mas remedio que denormalizar un poco la tabla de expedientes y agregar estos dos campos, e implementar el mecanismo para actualizarlos en función de los cambios en la tabla de movimientos.

Saludos.

  • 0