Salta el contingut

Jardineria - Consultes multitaula - Composició externa

Resol totes les consultes utilitzant la sintaxis SQL. Utilitza LEFT i RIGHT combinant-lo amb el NATURAL JOIN, JOIN USING o JOIN ON al que millor s'adapti a cada consulta.

  1. Retorna una llista que mostri només els clients que no han realitzat cap pagament.

    Possible solució
    SELECT c.*
    FROM cliente c NATURAL LEFT JOIN pago p
    WHERE forma_pago IS NULL; 
    
  2. Retorna una llista que mostri només els clients que no han realitzat cap comanda.

    Possible solució
    SELECT c.*
    FROM cliente c NATURAL LEFT JOIN pedido p
    WHERE codigo_pedido IS NULL; 
    
  3. Mostra el nom dels clients que no hagin realitzat pagaments, amb el nom dels seus representants de vendes.

    Possible solució
    Amb LEFT JOIN
    SELECT c.nombre_cliente, CONCAT_WS(' ', e.nombre, e.apellido1, e.apellido2) nombre_representante
    FROM cliente c NATURAL LEFT JOIN
         pago p JOIN
         empleado e ON (c.codigo_empleado_rep_ventas = e.codigo_empleado)
    WHERE forma_pago IS NULL;
    
  4. Retorna una llista que mostri els clients que no hagin realitzat cap pagament o que no hagin realitzat cap comanda.

    Possible solució
    SELECT DISTINCT nombre_cliente
    FROM cliente c NATURAL LEFT JOIN 
         pago g LEFT JOIN
         pedido p ON (c.codigo_cliente = p.codigo_cliente)
    WHERE forma_pago IS NULL OR
          codigo_pedido IS NULL; 
    
  5. Retorna una llista que mostri només els empleats que no tenen cap oficina associada.

    Possible solució
    SELECT *
    FROM empleado NATURAL LEFT JOIN oficina
    WHERE codigo_oficina IS NULL;
    
  6. Retorna una llista que mostri només els empleats que no tenen cap client associat.

    Possible solució
    SELECT e.*
    FROM empleado e LEFT JOIN cliente c ON (e.codigo_empleado = c.codigo_empleado_rep_ventas)
    WHERE codigo_cliente IS NULL;
    
  7. Retorna una llista que mostri només els empleats que no tenen cap client associat juntament amb les dades de l'oficina on treballen.

    Possible solució
    SELECT e.nombre, e.apellido1, e.apellido2, o.telefono
    FROM empleado e LEFT JOIN 
         cliente c ON (e.codigo_empleado = c.codigo_empleado_rep_ventas) JOIN 
         oficina o USING (codigo_oficina)
    WHERE codigo_cliente IS NULL;
    
  8. Retorna una llista que mostri els empleats que no tenen cap oficina associada o bé que no tinguin cap client associat.

    Possible solució
    SELECT e.nombre, e.apellido1, e.apellido2
    FROM empleado e LEFT JOIN cliente c ON (e.codigo_empleado = c.codigo_empleado_rep_ventas)
    WHERE codigo_oficina IS NULL OR codigo_cliente IS NULL;
    

    Per saber que no té cap oficina associada només cal mirar si el codi d'oficina de l'empleat IS NULL

    No calia el JOIN oficina
    SELECT DISTINCT e.nombre, e.apellido1, e.apellido2
    FROM empleado e 
         LEFT JOIN oficina o USING (codigo_oficina)
         LEFT JOIN cliente c ON (e.codigo_empleado = c.codigo_empleado_rep_ventas)
    WHERE codigo_oficina IS NULL OR codigo_cliente IS NULL;
    
  9. Retorna una llista dels productes que mai hagin aparegut en una comanda.

    Possible solució
    SELECT p.*
    FROM producto p NATURAL LEFT JOIN detalle_pedido dp
    WHERE codigo_pedido IS NULL;
    
  10. Retorna el nom dels clients que no hagin fet pagaments i el nom dels seus representants, amb la ciudad de l'oficina a la que pertany el representant.

    Possible solució
    SELECT c.nombre_cliente, e.nombre, apellido1, apellido2, o.ciudad
    FROM cliente c NATURAL LEFT JOIN
         pago p JOIN
         empleado e ON (c.codigo_empleado_rep_ventas = e.codigo_empleado) JOIN
        oficina o USING (codigo_oficina)
    WHERE forma_pago IS NULL;
    
  11. Retorna una llista dels productes que mai hagin aparegut en una comanda. El resultat ha de mostrar el nom del producte i la descripció i la imatge de la gama del producto.

    Possible solució
    SELECT p.nombre, gp.descripcion_texto, gp.imagen
    FROM producto p NATURAL LEFT JOIN gama_producto gp NATURAL LEFT JOIN detalle_pedido dp
    WHERE codigo_pedido IS NULL;
    
  12. Retorna les oficines on no hi treballi cap dels empleats que hagi estat representants de vendes d'algún client que hagi realitzat la compra d'algún producte de la gama Frutales. (SUBCONSULTA)

    Possible solució
    Amb condicio dins el JOIN ... ON
    SELECT o.*, oa.ciudad
    FROM gama_producto gp 
        JOIN producto p ON (gp.gama = p.gama AND gp.gama = 'Aromaticas')
        NATURAL JOIN detalle_pedido
        NATURAL JOIN pedido 
        NATURAL JOIN cliente 
        JOIN empleado ON (codigo_empleado_rep_ventas = codigo_empleado) 
        JOIN oficina oa USING (codigo_oficina)
        RIGHT JOIN oficina o USING (codigo_oficina)  
    WHERE oa.ciudad IS NULL
    
    Amb JOIN i SELECT en FROM
    SELECT o.*, oa.ciudad
    FROM oficina o
        LEFT JOIN (
            SELECT DISTINCT codigo_oficina, oficina.ciudad
            FROM gama_producto NATURAL JOIN producto NATURAL JOIN detalle_pedido NATURAL JOIN pedido NATURAL JOIN cliente 
                JOIN empleado ON (codigo_empleado_rep_ventas = codigo_empleado) 
                JOIN oficina USING (codigo_oficina)
            WHERE gama = "Aromaticas"
        ) oa USING (codigo_oficina)
    WHERE oa.ciudad IS NULL
    
    Amb subconsulta
    SELECT o.*
    FROM oficina o
    WHERE codigo_oficina NOT IN (
        SELECT codigo_oficina 
        FROM producto pr
            JOIN detalle_pedido dp ON (dp.codigo_producto = pr.codigo_producto AND pr.gama = 'Frutales')
            JOIN pedido p ON (p.codigo_pedido = dp.codigo_pedido) 
            JOIN cliente c ON (c.codigo_cliente = p.codigo_cliente) 
            JOIN empleado e ON (c.codigo_empleado_rep_ventas = e.codigo_empleado)
        );
    
  13. Retorna una llista amb el codi i nom dels clients que han realitzat alguna comanda però no han realitzat cap pagament.

    Possible solució
    SELECT DISTINCT codigo_cliente, nombre_cliente
    FROM cliente c NATURAL JOIN pedido 
        NATURAL LEFT JOIN pago
    WHERE forma_pago IS NULL;
    
  14. Retorna una llista amb les dades dels empleats que no tenen clients associats i el nom del seu cap associat.

    Possible solució
    SELECT e.nombre, e.apellido1, e.apellido2, j.nombre, j.apellido1, j.apellido2
    FROM empleado e
        LEFT JOIN cliente c ON (c.codigo_empleado_rep_ventas = e.codigo_empleado)
        JOIN empleado j ON (e.codigo_jefe = j.codigo_empleado)
    WHERE c.codigo_cliente IS NULL ;