none
Como mostrar registros nulo y no nulos ? RRS feed

  • Pregunta

  • Hola, estoy intentando hacer una vista en donde listo mesas, cliente, y reserva..Estoy programando en C#..Mi dominio es un restaurante. Sucede que cuando un cliente llama y comunica que no va a querer por ejemplo las dos mesas que reservo, sino solo una, yo lo que hago es mandar el FK de mi mesa a mi tabla intermedia como nulo, pero a la hora de querer mostrarlo no puedo. Mis tablas son Mesa, Reserva, y MesaxReserva. Mi vista es la siguiente:

    create view V_DetallesReserva as
    SELECT MesaxReserva.Id_MesaxRes as ID_Detalle,Reserva.Id_Res as ID_Reserva, Reserva.Fecha as Fecha, Reserva.Hora as Hora, Reserva.Detalle as Detalle,Reserva.Estado as Estado, Cliente.Nombre as Cliente, Cliente.DNI, Cliente.Telefono as Teléfono, Cliente.E_Mail, Mesa.Id_Mes as Numero_Mesa
    from Reserva
    inner join MesaxReserva on MesaxReserva.Id_Res=Reserva.Id_Res
    inner join Mesa on Mesa.Id_Mes=MesaxReserva.Id_Mes
    inner join Cliente on Cliente.Id_Clie=Reserva.Id_Cliente
    where MesaxReserva.Id_Mes is null or 
    MesaxReserva.Id_Mes <> null
    group by Reserva.Id_Res, Reserva.Fecha, Reserva.Hora, Reserva.Detalle, Reserva.Estado, Cliente.Nombre, Cliente.Telefono,  Mesa.Id_Mes, Cliente.DNI, Cliente.E_Mail, MesaxReserva.Id_MesaxRes

    Cuando borro una mesa de mi reserva, mi tabla intermedia queda así:

    No se si esta bien mandarle un valor nulo cuando elimino una mesa, esta bien ?. Mi idea de mostrar en la vista las mesas que tienen campos nulos, es por si el cliente se arrepiente y yo tenga la posibilidad de editar la reserva y poder agregar una mesa por ese campo nulo..Dese ya muchas gracias !!!


    cervera

    jueves, 12 de septiembre de 2019 2:13

Respuestas

  • Veo un problema en tu sentencia SQL donde haces esto:

    where MesaxReserva.Id_Mes is null or MesaxReserva.Id_Mes <> null

    La parte donde dice MesaxReserva.Id_Mes <> null siempre devuelve FALSE, tanto si Id_Mes es null como si no lo es. Si quieres buscar los valores que no sean null hay que poner MesaxReserva.Id_Mes IS NOT null. Aunque en este caso no sirve para nada, dado el "or" que estás haciendo (siempre va a ser null o not null).

    jueves, 12 de septiembre de 2019 6:37
  • Hola Cervera Nicolás:

    Creo que no estas planteando del todo correctamente el tratamiento de los nulos y los conjuntos. A priori el tratamiento de los nulos, lo debes de hacer con relaciones que permitan nulos.

    CREATE TABLE RESERVA (Id_Res INT, FECHA DATETIME, HORA TIME, DETALLE VARCHAR(100), ESTADO INT, ID_CLIENTE INT)
    CREATE TABLE CLIENTE(ID_CLIE INT, NOMBRE VARCHAR(100), TELEFONO VARCHAR(100), DNI VARCHAR(15), E_MAIL VARCHAR(100))
    CREATE TABLE MESA (ID_MES INT)
    CREATE TABLE MESAXRESERVA (ID_MESAXRES INT, ID_RES INT, ID_MES INT);
    GO
    
    INSERT INTO MESA (ID_MES)
    VALUES (1),(2);
    GO
    
    INSERT INTO CLIENTE (ID_CLIE, NOMBRE, TELEFONO, DNI, E_MAIL)
    VALUES
    (1,'CERVERA NICOLÁS', '0000', '1111', 'email@hotmail.com');
    GO
    
    INSERT INTO MESAXRESERVA (ID_MESAXRES, ID_RES, ID_MES)
    VALUES
    (1,1,1),
    (2,1,NULL);
    GO
    
    INSERT INTO RESERVA (ID_RES, FECHA, HORA, DETALLE, ESTADO, ID_CLIENTE)
    VALUES
     (1,'20190101','10:25:00','PARA CELEBRACIÓN', 0, 1);
    GO

    En el escenario que cuentas, el cliente 1 ha borrado la reserva de su mesa (id reserva 2) -- (2,1,NULL);

    No se si esta bien mandarle un valor nulo cuando elimino una mesa, esta bien ?. Mi idea de mostrar en la vista las mesas que tienen campos nulos, es por si el cliente se arrepiente y yo tenga la posibilidad de editar la reserva y poder agregar una mesa por ese campo nulo.

    Puedes hacer algo del estilo:

    SELECT MesaxReserva.Id_MesaxRes AS ID_Detalle, 
           Reserva.Id_Res AS ID_Reserva, 
           Reserva.Fecha AS Fecha, 
           Reserva.Hora AS Hora, 
           Reserva.Detalle AS Detalle, 
           Reserva.Estado AS Estado, 
           Cliente.Nombre AS Cliente, 
           Cliente.DNI, 
           Cliente.Telefono AS Teléfono, 
           Cliente.E_Mail, 
           Mesa.Id_Mes AS Numero_Mesa
    FROM MesaxReserva
         LEFT JOIN Reserva ON MesaxReserva.Id_Res = Reserva.Id_Res
         LEFT JOIN Mesa ON Mesa.Id_Mes = MesaxReserva.Id_Mes
         LEFT JOIN Cliente ON Cliente.Id_Clie = Reserva.Id_Cliente;

    Salida

    En una vista, no se mandan parámetros, solo recoges resultados de ella que puedes filtrar.

    Espero te ayude

    jueves, 12 de septiembre de 2019 6:37

Todas las respuestas

  • Veo un problema en tu sentencia SQL donde haces esto:

    where MesaxReserva.Id_Mes is null or MesaxReserva.Id_Mes <> null

    La parte donde dice MesaxReserva.Id_Mes <> null siempre devuelve FALSE, tanto si Id_Mes es null como si no lo es. Si quieres buscar los valores que no sean null hay que poner MesaxReserva.Id_Mes IS NOT null. Aunque en este caso no sirve para nada, dado el "or" que estás haciendo (siempre va a ser null o not null).

    jueves, 12 de septiembre de 2019 6:37
  • Hola Cervera Nicolás:

    Creo que no estas planteando del todo correctamente el tratamiento de los nulos y los conjuntos. A priori el tratamiento de los nulos, lo debes de hacer con relaciones que permitan nulos.

    CREATE TABLE RESERVA (Id_Res INT, FECHA DATETIME, HORA TIME, DETALLE VARCHAR(100), ESTADO INT, ID_CLIENTE INT)
    CREATE TABLE CLIENTE(ID_CLIE INT, NOMBRE VARCHAR(100), TELEFONO VARCHAR(100), DNI VARCHAR(15), E_MAIL VARCHAR(100))
    CREATE TABLE MESA (ID_MES INT)
    CREATE TABLE MESAXRESERVA (ID_MESAXRES INT, ID_RES INT, ID_MES INT);
    GO
    
    INSERT INTO MESA (ID_MES)
    VALUES (1),(2);
    GO
    
    INSERT INTO CLIENTE (ID_CLIE, NOMBRE, TELEFONO, DNI, E_MAIL)
    VALUES
    (1,'CERVERA NICOLÁS', '0000', '1111', 'email@hotmail.com');
    GO
    
    INSERT INTO MESAXRESERVA (ID_MESAXRES, ID_RES, ID_MES)
    VALUES
    (1,1,1),
    (2,1,NULL);
    GO
    
    INSERT INTO RESERVA (ID_RES, FECHA, HORA, DETALLE, ESTADO, ID_CLIENTE)
    VALUES
     (1,'20190101','10:25:00','PARA CELEBRACIÓN', 0, 1);
    GO

    En el escenario que cuentas, el cliente 1 ha borrado la reserva de su mesa (id reserva 2) -- (2,1,NULL);

    No se si esta bien mandarle un valor nulo cuando elimino una mesa, esta bien ?. Mi idea de mostrar en la vista las mesas que tienen campos nulos, es por si el cliente se arrepiente y yo tenga la posibilidad de editar la reserva y poder agregar una mesa por ese campo nulo.

    Puedes hacer algo del estilo:

    SELECT MesaxReserva.Id_MesaxRes AS ID_Detalle, 
           Reserva.Id_Res AS ID_Reserva, 
           Reserva.Fecha AS Fecha, 
           Reserva.Hora AS Hora, 
           Reserva.Detalle AS Detalle, 
           Reserva.Estado AS Estado, 
           Cliente.Nombre AS Cliente, 
           Cliente.DNI, 
           Cliente.Telefono AS Teléfono, 
           Cliente.E_Mail, 
           Mesa.Id_Mes AS Numero_Mesa
    FROM MesaxReserva
         LEFT JOIN Reserva ON MesaxReserva.Id_Res = Reserva.Id_Res
         LEFT JOIN Mesa ON Mesa.Id_Mes = MesaxReserva.Id_Mes
         LEFT JOIN Cliente ON Cliente.Id_Clie = Reserva.Id_Cliente;

    Salida

    En una vista, no se mandan parámetros, solo recoges resultados de ella que puedes filtrar.

    Espero te ayude

    jueves, 12 de septiembre de 2019 6:37
  • Me soluciono el problema, muchas gracias !! Veo que la solución fue solamente cambiar el Inner por el Left, como uno se da cuenta cuando es Left, Right, Cross o Inner ? Desde ya muchas gracias !!


    Cervera Nicolás


    jueves, 12 de septiembre de 2019 17:37
  • Hola Cervera Nicolás:

    Fijate bien en el diagrama.

    Inner join, cuando haya registros coincidentes en los dos conjuntos.

    Left cuando quieres que te muestre todos los registros del conjunto de la izquierda, tengan o no valores en el de la derecha (aquí se juega con el where derecha.id is null o is not null).

    Right igual que left, pero manda el de la derecha.

    Full Todos los registros de la izquierda y todos los de la derecha, con sus coincidencias.

    Cross Join: Es todos por todos. O lo que es lo mismo, por cada fila de la izquierda, todas las de la derecha.

    Existen infinidad de páginas e imágenes en la web que lo explican más o menos bien.

    Un ejemplo más.

    jueves, 12 de septiembre de 2019 20:04