none
where con select RRS feed

  • Pregunta

  • Hola

    Tengo una consulta que me devuelve un valor: 36255

    Select MAX(PEDIDO_ID) from PEDIDO group by PEDIDO_CODREP,PEDIDO_FULLES having dbo.PEDIDO.PEDIDO_FULLES =16277

    Si pongo el numero directamente en la consulta donde quiero usar el valor anterior me funciona bien: Select dbo.PEDIDO.PEDIDO_Sequencial FROM  dbo.PEDIDO where dbo.PEDIDO.PEDIDO_Id=36255

    Pero si uso la consulta para obtener el valor no me funciona:

    Select dbo.PEDIDO.PEDIDO_Sequencial FROM  dbo.PEDIDO where dbo.PEDIDO.PEDIDO_Id=
      (Select MAX(PEDIDO_ID) from PEDIDO group by PEDIDO_CODREP,PEDIDO_FULLES having dbo.PEDIDO.PEDIDO_FULLES =16277)

    Alguien me podría ayudar?.

    viernes, 22 de septiembre de 2017 11:47

Respuestas

  • Select dbo.PEDIDO.PEDIDO_Sequencial FROM  dbo.PEDIDO where dbo.PEDIDO.PEDIDO_Id=
      (Select MAX(PEDIDO_ID) from PEDIDO where dbo.PEDIDO.PEDIDO_FULLES =16277)

    Creo que ya veo donde está el fallo. En la consulta principal has llamado a la tabla dbo.Pedido, pero en la subconsulta la llamas solo PEDIDO, y luego en el Where de la subconsulta condicionas dbo.Pedido, con lo que se cree que está correlacinada con la principal y te compara con ella y no con la subconsulta.

    Solución:

    Select a.PEDIDO_Sequencial FROM  dbo.PEDIDO as a where a.PEDIDO_Id=
      (Select MAX(b.PEDIDO_ID) from dbo.PEDIDO as b where b.PEDIDO_FULLES =16277)

    • Marcado como respuesta Pequiro sábado, 23 de septiembre de 2017 11:16
    sábado, 23 de septiembre de 2017 10:44

Todas las respuestas

  • ¿Podrías especificar el "no me funciona"? ¿Cuál es la forma en la que no funciona? ¿Se produce algún mensaje de error? ¿Devuelve resultados pero no son los que esperabas? Describe por favor los síntomas con más detalle, para que podamos tener algo de información en la que basar la respuesta.
    viernes, 22 de septiembre de 2017 12:08
  • Yo lo veo correcto. Que error te sale?

    Prueba con IN

    Select dbo.PEDIDO.PEDIDO_Sequencial FROM  dbo.PEDIDO where dbo.PEDIDO.PEDIDO_Id IN
      (Select MAX(PEDIDO_ID) from PEDIDO group by PEDIDO_CODREP,PEDIDO_FULLES having dbo.PEDIDO.PEDIDO_FULLES =16277)

    viernes, 22 de septiembre de 2017 12:30
  • Coincido con Jordi en no ver error en tu comando SQL:

    [
    Select dbo.PEDIDO.PEDIDO_Sequencial FROM  dbo.PEDIDO where dbo.PEDIDO.PEDIDO_Id=
    (Select MAX(PEDIDO_ID) from PEDIDO group by PEDIDO_CODREP,PEDIDO_FULLES having dbo.PEDIDO.PEDIDO_FULLES =16277)

    ]

    Esta otra sintaxis también te debería funcionar:
    [
    select  b.PEDIDO_Sequencial
    from (
    select max(PEDIDO_ID) as MAX_PEDIDO_ID
    from PEDIDO 
    group by PEDIDO_CODREP, PEDIDO_FULLES 
    having PEDIDO_FULLES = 16277
    ) a 
    inner join PEDIDO  b on b.PEDIDO_Id = a.MAX_PEDIDO_ID
    ]

    Lo que no veo es el por qué de esa agrupación por dos columnas para sacar un máximo...  

    Saludos,

    PCID.


    viernes, 22 de septiembre de 2017 13:40
  • Hola 

    Cuando digo no me funciona no me refiero a que me de un error, me refiero a que no me devuelve ningún valor.

    Mientras que si pongo el numero, resultado de la consulta, directamente obtengo los valores correctos.

    sábado, 23 de septiembre de 2017 8:56
  • Tienes razón Jordi

    En realidad lo que puse fue una prueba, en realidad lo que había puesto inicialmente fue:

    Select MAX(PEDIDO_ID) from PEDIDO where dbo.PEDIDO.PEDIDO_FULLES =16277

    Con lo que la consulta completa quedaba:

    Select dbo.PEDIDO.PEDIDO_Sequencial FROM  dbo.PEDIDO where dbo.PEDIDO.PEDIDO_Id=
      (Select MAX(PEDIDO_ID) from PEDIDO where dbo.PEDIDO.PEDIDO_FULLES =16277)

    Es muy sencillo pero no entiendo porque no me devuelve ningún valor.

    sábado, 23 de septiembre de 2017 9:16
  • En teoría debería funcionar perfectamente la subconsulta tal como la tienes. Haz una prueba, pídele desde SSMS el plan de ejecución con la consulta tecleada a mano, y vuélvele a pedir el plan de ejecución con la consulta que incluye la subconsulta. Si te salen distintas estrategias de acceso a datos (por ejemplo, una de ellas hace un clustered index scan y la otra un index seek), y con uno de los métodos funciona y el otro no, podría indicar una corrupción en uno de los índices. En ese caso, haz un DBCC CHECKDB a ver si detecta algún error, o incluso haz un Rebuild de los índices por si acaso.
    sábado, 23 de septiembre de 2017 9:18
  • Coincido con Jordi en no ver error en tu comando SQL:

    [
    Select dbo.PEDIDO.PEDIDO_Sequencial FROM  dbo.PEDIDO where dbo.PEDIDO.PEDIDO_Id=
    (Select MAX(PEDIDO_ID) from PEDIDO group by PEDIDO_CODREP,PEDIDO_FULLES having dbo.PEDIDO.PEDIDO_FULLES =16277)

    ]

    Esta otra sintaxis también te debería funcionar:
    [
    select  b.PEDIDO_Sequencial
    from (
    select max(PEDIDO_ID) as MAX_PEDIDO_ID
    from PEDIDO 
    group by PEDIDO_CODREP, PEDIDO_FULLES 
    having PEDIDO_FULLES = 16277
    ) a 
    inner join PEDIDO  b on b.PEDIDO_Id = a.MAX_PEDIDO_ID
    ]

    Lo que no veo es el por qué de esa agrupación por dos columnas para sacar un máximo...  

    Saludos,

    PCID.


    Hola

    Si, con esta sintaxis me funciona bien, aunque sigo con la duda que la mia que la veo mas sencilla no funcione.

    Muchas gracias de todas formas.


    sábado, 23 de septiembre de 2017 9:38
  • Te paso las imágenes ya que yo me pierdo un poco con esto.
    sábado, 23 de septiembre de 2017 9:52
  • Te paso las imágenes
    Según eso, la búsqueda final se hace siempre a través del índice clustered, con lo que ese paso no debería diferir en un caso o el otro. La diferencia podría estar en la resolución de la subconsulta, que la está haciendo a través del índice idx_pedido_fulles. ¿Podrías pedir el plan de la subconsulta por sí sola, a ver si usa ese mismo índice cuando la ejecutas fuera de la sentencia principal?
    sábado, 23 de septiembre de 2017 10:30
  • Select dbo.PEDIDO.PEDIDO_Sequencial FROM  dbo.PEDIDO where dbo.PEDIDO.PEDIDO_Id=
      (Select MAX(PEDIDO_ID) from PEDIDO where dbo.PEDIDO.PEDIDO_FULLES =16277)

    Creo que ya veo donde está el fallo. En la consulta principal has llamado a la tabla dbo.Pedido, pero en la subconsulta la llamas solo PEDIDO, y luego en el Where de la subconsulta condicionas dbo.Pedido, con lo que se cree que está correlacinada con la principal y te compara con ella y no con la subconsulta.

    Solución:

    Select a.PEDIDO_Sequencial FROM  dbo.PEDIDO as a where a.PEDIDO_Id=
      (Select MAX(b.PEDIDO_ID) from dbo.PEDIDO as b where b.PEDIDO_FULLES =16277)

    • Marcado como respuesta Pequiro sábado, 23 de septiembre de 2017 11:16
    sábado, 23 de septiembre de 2017 10:44
  • Select dbo.PEDIDO.PEDIDO_Sequencial FROM  dbo.PEDIDO where dbo.PEDIDO.PEDIDO_Id=
      (Select MAX(PEDIDO_ID) from PEDIDO where dbo.PEDIDO.PEDIDO_FULLES =16277)

    Creo que ya veo donde está el fallo. En la consulta principal has llamado a la tabla dbo.Pedido, pero en la subconsulta la llamas solo PEDIDO, y luego en el Where de la subconsulta condicionas dbo.Pedido, con lo que se cree que está correlacinada con la principal y te compara con ella y no con la subconsulta.

    Solución:

    Select a.PEDIDO_Sequencial FROM  dbo.PEDIDO as a where a.PEDIDO_Id=
      (Select MAX(b.PEDIDO_ID) from dbo.PEDIDO as b where b.PEDIDO_FULLES =16277)

    Tienes razón, Me había dejado un dbo en uno de los PEDIDO.

    Perfecto.

    Muchas gracias.

    sábado, 23 de septiembre de 2017 11:17