none
Problemas consulta SQL RRS feed

  • Pregunta

  • Buenas tardes a todos. Bueno. Como dice el título, tengo una consulta sql que me está dando problemas. Esta es mi consulta.

    select p.sc_motel_producto, p.sc_motel_producto_nombre
    from sc_motel_prod_hab ph right join sc_motel_producto p on ph.sc_motel_producto = p.sc_motel_producto
    WHERE(ph.sc_motel_producto = p.sc_motel_producto) and (ph.sc_motel_habitacion = 1)
    
    UNION ALL 
    
    SELECT a.sc_motel_producto, a.sc_motel_producto_nombre FROM sc_motel_prod_hab as b, sc_motel_producto as a
    WHERE(b.sc_motel_producto <> a.sc_motel_producto) and (b.sc_motel_habitacion=1)

    Las tablas referenciadas son M:M (sc_motel_prod_hab contiene la foranea de sc_motel_producto y de sc_motel_habitacion[solo trabajo con producto y prod_hab, NO HABITACION) El resultado que debo obtener sería este.

    todo lo que está marcado en azul es el orden correcto, pero se puede apreciar que la consulta despueés de estos datos, me ordena los productos por nombre o codigo.....

    ¡¡¡¡LO QUE NECESITO ES OBTENER SOLO LO QUE ESTÁ MARCADO EN AZUL!!!!!

    Que es lo que podría estar haciendo mal? he probado cambiando las uniones, los right join, etc pero no doy con el resultado.

    Espero me puedan ayudar estimados.

    Muchas gracias a todos 

    PD: Esta es mi tabla M:M (sc_motel_prod_hab)


    miércoles, 6 de septiembre de 2017 14:39

Respuestas

  • sc_motel_producto  (p.sc_motel_producto, p.sc_motel_producto_nombre) where ph.sc_motel_habitacion = 1

    sc_motel_prod_hab  (ph.sc_motel_producto )

    Prueba asi

    select p.sc_motel_producto, p.sc_motel_producto_nombre from sc_motel_prod_hab ph left join sc_motel_producto p on ph.sc_motel_producto = p.sc_motel_producto WHERE ph.sc_motel_habitacion = 1 UNION ALL

    select p.sc_motel_producto, p.sc_motel_producto_nombre
    from sc_motel_prod_hab ph inner join sc_motel_producto p on ph.sc_motel_producto = p.sc_motel_producto
    WHERE ph.sc_motel_habitacion = 1



    Pasa los puntos prro v:


    miércoles, 6 de septiembre de 2017 14:54
  • Entiendo, ¿te interesa distinguir entre los consumidos y no consumidos?, por ejemplo una marca al final como '(C)'

    SELECT 1 AS g, p.sc_motel_producto, CONCAT(p.sc_motel_producto_nombre, '(C)')  AS prod
    FROM
        sc_motel_prod_hab mph
        INNER JOIN sc_motel_producto p ON mph.sc_motel_producto = p.sc_motel_producto
    WHERE mph.sc_motel_habitacion = 1
    UNION ALL
    SELECT 2, p.sc_motel_producto, p.sc_motel_producto_nombre
    FROM        
        sc_motel_producto p
    WHERE 
        NOT EXISTS(SELECT 1 FROM sc_motel_prod_hab mph 
    	   WHERE p.sc_motel_producto = mph.sc_motel_producto AND mph.sc_motel_habitacion = 1)
    ORDER BY g, prod;
    GO


    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    • Marcado como respuesta Enrique Aleman miércoles, 6 de septiembre de 2017 15:25
    miércoles, 6 de septiembre de 2017 15:08

Todas las respuestas

  • Si sólo deseas recuperar los productos consumidos para cierta habitación, ¿por qué la unión de conjuntos?.

    SELECT p.sc_motel_producto, p.sc_motel_producto_nombre
    FROM
        sc_motel_prod_hab mph
        INNER JOIN sc_motel_producto p ON mph.sc_motel_producto = p.sc_motel_producto
    WHERE mph.sc_motel_habitacion = 1;
    


    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    miércoles, 6 de septiembre de 2017 14:52
  • sc_motel_producto  (p.sc_motel_producto, p.sc_motel_producto_nombre) where ph.sc_motel_habitacion = 1

    sc_motel_prod_hab  (ph.sc_motel_producto )

    Prueba asi

    select p.sc_motel_producto, p.sc_motel_producto_nombre from sc_motel_prod_hab ph left join sc_motel_producto p on ph.sc_motel_producto = p.sc_motel_producto WHERE ph.sc_motel_habitacion = 1 UNION ALL

    select p.sc_motel_producto, p.sc_motel_producto_nombre
    from sc_motel_prod_hab ph inner join sc_motel_producto p on ph.sc_motel_producto = p.sc_motel_producto
    WHERE ph.sc_motel_habitacion = 1



    Pasa los puntos prro v:


    miércoles, 6 de septiembre de 2017 14:54
  • Williams. Gracias por tu tiempo. La idea de la unión es que estos productos los cargo en listas (dropDownList) entonces el primer registro que me debe aparecer en dicho ddl es el que ya tiene asignado, y después de ese, el resto de la lista. esa es la idea. Tienas alguna idea de como lograr eso?

    Gracias!! 

    miércoles, 6 de septiembre de 2017 14:56
  • Que es lo que realmente necesitas cuando haces el where <> es por eso el resultado que te muestra diferente . Cual es tu necesidad? 


    Pasa los puntos prro v:

    miércoles, 6 de septiembre de 2017 14:58
  • Estimado, estos datos los tengo que mostrar en listas (dropDownList) entonces la idea es que el primer registro de dicho ddl sea el que ya tiene asignado, después de ese, la lista completa de productos. eso es lo que necesito.

    Gracias por la preocupación.

    miércoles, 6 de septiembre de 2017 15:00
  • Entiendo, ¿te interesa distinguir entre los consumidos y no consumidos?, por ejemplo una marca al final como '(C)'

    SELECT 1 AS g, p.sc_motel_producto, CONCAT(p.sc_motel_producto_nombre, '(C)')  AS prod
    FROM
        sc_motel_prod_hab mph
        INNER JOIN sc_motel_producto p ON mph.sc_motel_producto = p.sc_motel_producto
    WHERE mph.sc_motel_habitacion = 1
    UNION ALL
    SELECT 2, p.sc_motel_producto, p.sc_motel_producto_nombre
    FROM        
        sc_motel_producto p
    WHERE 
        NOT EXISTS(SELECT 1 FROM sc_motel_prod_hab mph 
    	   WHERE p.sc_motel_producto = mph.sc_motel_producto AND mph.sc_motel_habitacion = 1)
    ORDER BY g, prod;
    GO


    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    • Marcado como respuesta Enrique Aleman miércoles, 6 de septiembre de 2017 15:25
    miércoles, 6 de septiembre de 2017 15:08
  • Gracias a todos por su ayuda y tiempo. Fueron muy útiles sus respuestas.

    Saludos!!


    miércoles, 6 de septiembre de 2017 15:26
  • De ser asi no es necesario hacer la union de dos queries.

    SELECT
        CASE WHEN mph.sc_motel_habitacion = 1 THEN 1 ELSE 2 END AS g,
        p.sc_motel_producto,
        CONCAT(p.sc_motel_producto_nombre, CASE WHEN mph.sc_motel_habitacion = 1 THEN '(C)' ELSE '' END)  AS prod
    FROM
        sc_motel_prod_hab mph
        RIGHT OUTER JOIN 
        sc_motel_producto p 
        ON mph.sc_motel_producto = p.sc_motel_producto
        AND mph.sc_motel_habitacion = 1
    ORDER BY
        g,
        p.sc_motel_producto;
    GO


    AMB

    Some guidelines for posting questions...

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


    • Editado HunchbackMVP miércoles, 6 de septiembre de 2017 15:32
    • Propuesto como respuesta Willams Morales miércoles, 6 de septiembre de 2017 16:55
    miércoles, 6 de septiembre de 2017 15:32