martes, 18 de diciembre de 2012

Resolución ejercicio final (26) - Listar los proveedores de los que ha comprado artículos un cliente determinado.

RESOLUCIÓN DEL PUNTO 23 DEL ENUNCIADO DEL EJERCICIO FINAL.

En esta entrada resolveremos el punto 23:
Listar los proveedores de los que ha comprado artículos un cliente determinado.

Se trata de generar un listado en el que se incluyan los proveedores de los productos que ha comprado un cliente.

Para resolverlo se utilizará una subconsulta, que proporcionará el listado de los ids de los artículos que ha comprado el cliente, mientras que otra consulta localizará los proveedores que nos han vendido esos artículos.


Como primer paso se creará una subconsulta que obtenga el nombre de los proveedores de un artículo determinado a partir de su id_articulo.


select distinct proveedores.id_proveedor, proveedores.nombre
from lin_ac inner join cab_ac
on lin_ac.id_ac = cab_ac.id_ac 
inner join proveedores
on cab_ac.id_proveedor = proveedores.id_proveedor
where id_articulo = 8;


Esta consulta devolverá los nombres de los proveedores del artículo de id 8.

Pero sería más útil si se le pudiese indicar varios ids simultáneamente.

Para ello se modifica la consulta cambiando el operador de comparación de la cláusula WHERE por el operador IN, que realiza una operación similar pero sobre un conjunto de datos.

La consulta queda finalmente como se indica a continuación:

select distinct proveedores.id_proveedor, proveedores.nombre
from lin_ac inner join cab_ac
on lin_ac.id_ac = cab_ac.id_ac 
inner join proveedores
on cab_ac.id_proveedor = proveedores.id_proveedor
WHERE id_articulo IN (8, 21, 350);


Esta consulta devolverá los nombres de los proveedores de los artículos de id 8, 21 y 350; en este caso se añade a la salida un nuevo proveedor.

Como segundo paso se creará otra consulta que obtendrá  los ids de todos los artículos comprados por un cliente.

Estos ids serán suministrados a la consulta anterior dentro de la cláusula IN.


select id_articulo
from lin_fv inner join cab_fv
on lin_fv.id_fv = cab_fv.id_fv
where cab_fv.id_cliente = 1;


La salida de esta consulta es un listado de ids de los artículos que ha comprado un cliente.

Se puede observar que los ids pueden salir repetidos.

Podría parecer útil añadir la subcláusula DISTINCT para que no existiesen repeticiones, pero se debe tener en cuenta que para eliminar los duplicados se le obliga a la Base de Datos a realizar una ordenación de los registros por el campo en que se desean eliminar los duplicados, y esta operación es una de las más lentas que se le pueden solicitar a una Base de Datos.

Por otra parte estos datos serán usados dentro de una cláusula IN, lo que hace innecesario la eliminación de duplicados.

La consulta final quedaría como se indica a continuación:


select distinct proveedores.id_proveedor, proveedores.nombre
from lin_ac inner join cab_ac
on lin_ac.id_ac = cab_ac.id_ac 
inner join proveedores
on cab_ac.id_proveedor = proveedores.id_proveedor
where id_articulo in (select id_articulo
from lin_fv inner join cab_fv
on lin_fv.id_fv = cab_fv.id_fv
where cab_fv.id_cliente = 2)
order by 1;



NOTA: Para facilitar la lectura del listado se ha añadido al final una cláusula ORDER BY 1, lo que indica que el resultado se ordene por el primer campo mostrado.

No hay comentarios:

Publicar un comentario