none
Duda subconsulta RRS feed

  • Pregunta

  • Buenas tengo 2 tablas que las relaciono mediante una consulta left outer join , esta consulta es rápida de ejecutar seria esta

     SELECT   LO.campo1 , L.campo2
     from Lentes L left outer join LentesOferta LO  on L.codigoLente=LO.codigoLente and L.proveedorLente=LO.proveedor
     where L.activo='S' and L.proveedorLente=@proveedorLente and LO.id is not null 

    El problema lo tengo cuando le pongo una subconsulta que es esta

    SELECT   LO.campo1 , L.campo2,
    (Select  count(*) from LentesSuplementos LS where LS.idLente = L.idLente and LS.proveedorLente=l.proveedorLente) as numeroSuplementos
     from Lentes L left outer join LentesOferta LO  on L.codigoLente=LO.codigoLente and L.proveedorLente=LO.proveedor
     where L.activo='S' and L.proveedorLente=@proveedorLente and LO.id is not null 

    Lo que quiero es para cara registro un count de la tabla LentesSuplementos para ese id.

    Gracias,

    viernes, 10 de febrero de 2017 10:27

Respuestas

  • golfgti6,

    ¿LEFT JOIN bajo la condición de seleccionar sólo las filas que no sean NULL? ¿No te suena a INNER JOIN?. 

    La solución pasa por contener en memoria (o disco en caso la lista sea extensa) la cuenta agrupada por código, teniendo esos valores es simple combinar con los resultados de la consulta principal:

    WITH Suplementos AS
    (
        SELECT LS.codigoLente, COUNT(*) AS [Cuenta] FROM LentesSuplementos LS 
        WHERE LS.proveedorLente = @proveedorLente
        GROUP BY LS.codigoLente
    )
    SELECT   
        LO.campo1, L.campo2, COALESCE(S.Cuenta, 0)
    FROM 
        Lentes L 
        INNER JOIN LentesOferta LO ON L.codigoLente = LO.codigoLente 
    	   AND L.proveedorLente = LO.proveedor
        LEFT JOIN Suplementos S ON (L.codigoLente = S.codigoLente)
    WHERE 
        L.activo = 'S' AND L.proveedorLente = @proveedorLente;
    GO

    ¿La tabla [Lentes] tiene la columna [idLente] además de la columna [codigoLente]? Imagino que es un error de escritura.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.



    • Propuesto como respuesta Joyce_ACModerator viernes, 10 de febrero de 2017 15:16
    • Marcado como respuesta golfgti6 viernes, 10 de febrero de 2017 16:45
    viernes, 10 de febrero de 2017 14:39

Todas las respuestas

  • Me pregunto si en realidad necesitas el OUTER JOIN ya que al parecer buscas filas que machen (... and LO.id is not null) lo cual traformaria el OUTER JOIN en un INNER JOIN.

    Por otro lugar, sin saber la cardinalidad de las relaciones, yo usaria un query para agrupar y lo uniria con el query inicial.

    with Q1 as (
    select
        LO.campo1, L.campo2, L.idLente
    from
        Lentes as L
        inner join
        LentesOferta as LO on LO.codigoLente = L.codigoLente
        and LO.proveedorLente = L.proveedorLente
    where
        L.activo = 'S' and L.proveedorLente = @proveedorLente
    )
    , Q2 as (
    select idLente, count(*) as cantidad_suplementos
    from LentesSuplementos
    where proveedorLente = @proveedorLente
    group by idLente
    )
    select Q1.campo1, Q1.campo2, Q2.cantidad_suplementos
    from Q1 inner join Q2 on Q1.idLente = Q2.idLente;


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas



    viernes, 10 de febrero de 2017 13:14
  • golfgti6,

    ¿LEFT JOIN bajo la condición de seleccionar sólo las filas que no sean NULL? ¿No te suena a INNER JOIN?. 

    La solución pasa por contener en memoria (o disco en caso la lista sea extensa) la cuenta agrupada por código, teniendo esos valores es simple combinar con los resultados de la consulta principal:

    WITH Suplementos AS
    (
        SELECT LS.codigoLente, COUNT(*) AS [Cuenta] FROM LentesSuplementos LS 
        WHERE LS.proveedorLente = @proveedorLente
        GROUP BY LS.codigoLente
    )
    SELECT   
        LO.campo1, L.campo2, COALESCE(S.Cuenta, 0)
    FROM 
        Lentes L 
        INNER JOIN LentesOferta LO ON L.codigoLente = LO.codigoLente 
    	   AND L.proveedorLente = LO.proveedor
        LEFT JOIN Suplementos S ON (L.codigoLente = S.codigoLente)
    WHERE 
        L.activo = 'S' AND L.proveedorLente = @proveedorLente;
    GO

    ¿La tabla [Lentes] tiene la columna [idLente] además de la columna [codigoLente]? Imagino que es un error de escritura.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.



    • Propuesto como respuesta Joyce_ACModerator viernes, 10 de febrero de 2017 15:16
    • Marcado como respuesta golfgti6 viernes, 10 de febrero de 2017 16:45
    viernes, 10 de febrero de 2017 14:39
  • golfgti6,

    ¿LEFT JOIN bajo la condición de seleccionar sólo las filas que no sean NULL? ¿No te suena a INNER JOIN?. 

    La solución pasa por contener en memoria (o disco en caso la lista sea extensa) la cuenta agrupada por código, teniendo esos valores es simple combinar con los resultados de la consulta principal:

    WITH Suplementos AS
    (
        SELECT LS.codigoLente, COUNT(*) AS [Cuenta] FROM LentesSuplementos LS 
        WHERE LS.proveedorLente = @proveedorLente
        GROUP BY LS.codigoLente
    )
    SELECT   
        LO.campo1, L.campo2, COALESCE(S.Cuenta, 0)
    FROM 
        Lentes L 
        INNER JOIN LentesOferta LO ON L.codigoLente = LO.codigoLente 
    	   AND L.proveedorLente = LO.proveedor
        LEFT JOIN Suplementos S ON (L.codigoLente = S.codigoLente)
    WHERE 
        L.activo = 'S' AND L.proveedorLente = @proveedorLente;
    GO

    ¿La tabla [Lentes] tiene la columna [idLente] además de la columna [codigoLente]? Imagino que es un error de escritura.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.



    Muchas gracias por la respuesta , fué un error de escritura.

    Muy agradecido.

    viernes, 10 de febrero de 2017 16:46