Consultando varias tablas

esquema de la base de datos: esquema.txt
datos: datos.txt

Es habitual tener que consultar varias tablas porque la información se encuentra distribuida entre ellas.

Sabemos que los artículos se venden empaquetados, junto con otros artículos o no, y en una cierta cantidad cada uno. Pero ¿qué contiene cada EMPAQUETADO? Pues veamos que hay en ARTICULO y en EMPAQUETADO

use tienda;

select * from articulo;


select * from empaquetado;

Examinando esas dos tablas no vemos cómo podemos enlazar una y otra. Cuidado, ARTICULO.cod y EMPAQUETADO.cod no son lo mismo, son códigos diferentes aunque se puedan comparar. Si ejecutamos la siguiente orden no obtenemos nada, cero filas.

select *

from articulo a, empaquetado e

where a.cod = e.cod; 

Mirando el esquema nos damos cuenta de que necesitamos CONTIENE, el verdadero enlace entre ARTICULO y EMPAQUETADO.

select *

from articulo a, empaquetado e, contiene c

where a.cod = c.articulo and c.empaquetado = e.cod

Como ya hemos dicho anteriormente, se trata de emparejar todas las tablas hasta que no quede ninguna sin enlazar. En este caso, 3 tablas, 2 emparejamientos. Aquí es más fácil imaginar que primero ponemos la tabla CONTIENE y le vamos pegando la información a la que se hace referencia. 

Lo mismo pero quitando columnas.

select a.cod,a.nombre,a.precio,c.cantidad,e.cod,e.nombre,e.pvp

from articulo a, empaquetado e, contiene c

where a.cod = c.articulo and c.empaquetado = e.cod;

Ahora ordenando por código de EMPAQUETADO para que se vea mejor en qué consiste la relación con ARTICULO.

select a.cod,a.nombre,a.precio,c.cantidad,e.cod,e.nombre,e.pvp

from articulo a, empaquetado e, contiene c

where a.cod = c.articulo and c.empaquetado = e.cod

order by e.cod,a.cod;

Estamos viendo qué artículos contiene cada paquete. Si nos detenemos en el paquete 4, tenemos 2 filas con un artículo diferente en cada una. El paquete 4 contiene los artículos 4 y 5, chorizos y morcillas La Asturiana.

¿Y si queremos añadir el nombre completo de la unidad de comercialización de cada artículo? Eso está en la tabla UNIDAD. Nueva tabla, nuevo enlace.

select a.cod,a.nombre,a.precio,c.cantidad,u.nombre,e.cod,e.nombre,e.pvp

from articulo a, empaquetado e, contiene c, unidad u

where a.cod = c.articulo and c.empaquetado = e.cod and a.unidad = u.unidad

order by e.cod,a.cod;

Evidentemente, podemos añadir los filtros que queramos. Solo vamos a mostrar los artículos, y el paquete al que pertenecen, que se comercialicen por kilos.

select a.cod,a.nombre,a.precio,c.cantidad,u.nombre,e.cod,e.nombre,e.pvp

from articulo a, empaquetado e, contiene c,unidad u

where a.cod = c.articulo and c.empaquetado = e.cod and a.unidad = u.unidad and a.unidad = 'k'

order by e.cod,a.cod;

Obtendremos el mismo resultado si usamos el nombre descriptivo de la unidad.

select a.cod,a.nombre,a.precio,c.cantidad,u.nombre,e.cod,e.nombre,e.pvp

from articulo a, empaquetado e, contiene c, unidad u

where a.cod = c.articulo and c.empaquetado = e.cod and a.unidad = u.unidad and u.nombre = 'kilogramos'

order by e.cod,a.cod;

3E consultando varias tablas.pdf