48 - Combinación interna (join)


Primer problema:

Una empresa tiene registrados sus clientes en una tabla llamada "clientes", también tiene una tabla "provincias" donde registra los nombres de las provincias.

1- Elimine las tablas "clientes" y "provincias":

   drop table clientes;
   drop table provincias;

2- Créelas con las siguientes estructuras:

 create table clientes (
  codigo number(5),
  nombre varchar2(30),
  domicilio varchar2(30),
  ciudad varchar2(20),
  codigoprovincia number(2)
 );

 create table provincias(
  codigo number(2),
  nombre varchar2(20)
 );

3- Ingrese algunos registros para ambas tablas:

 insert into provincias values(1,'Cordoba');
 insert into provincias values(2,'Santa Fe');
 insert into provincias values(3,'Corrientes');
 insert into provincias values(null,'La Pampa');

 insert into clientes values (1,'Lopez Marcos','Colon 111','Córdoba',1);
 insert into clientes values (2,'Perez Ana','San Martin 222','Cruz del Eje',1);
 insert into clientes values (3,'Garcia Juan','Rivadavia 333','Villa Maria',null);
 insert into clientes values (4,'Perez Luis','Sarmiento 444','Rosario',2);
 insert into clientes values (5,'Pereyra Lucas','San Martin 555','Cruz del Eje',1);
 insert into clientes values (6,'Gomez Ines','San Martin 666','Santa Fe',2);
 insert into clientes values (7,'Torres Fabiola','Alem 777','Ibera',3);
 insert into clientes values (8,'Garcia Paco','Avellaneda 888','Rawson',5);

4- Obtenga los datos de ambas tablas, usando alias.

Note que los registros de "clientes" cuyo valor de "codigoprovincia" que NO encuentran coincidencia con "codigo" de "provincias" no aparecen en el resultado de la consulta; caso de "Garcia Juan", que código de provincia nulo y "Garcia Paco", que tiene un código de provincia que no está presente en "provincias".

5- Obtenga la misma información anterior pero ordenada por nombre de provincia (join y order by)

6- Recupere todos los datos de los clientes de la provincia "Santa Fe" (join con where) (2 registros devueltos)

Ver solución

 drop table clientes;
 drop table provincias;

 create table clientes (
  codigo number(5),
  nombre varchar2(30),
  domicilio varchar2(30),
  ciudad varchar2(20),
  codigoprovincia number(2)
 );

 create table provincias(
  codigo number(2),
  nombre varchar2(20)
 );

 insert into provincias values(1,'Cordoba');
 insert into provincias values(2,'Santa Fe');
 insert into provincias values(3,'Corrientes');
 insert into provincias values(null,'La Pampa');

 insert into clientes values (1,'Lopez Marcos','Colon 111','Córdoba',1);
 insert into clientes values (2,'Perez Ana','San Martin 222','Cruz del Eje',1);
 insert into clientes values (3,'Garcia Juan','Rivadavia 333','Villa Maria',null);
 insert into clientes values (4,'Perez Luis','Sarmiento 444','Rosario',2);
 insert into clientes values (5,'Pereyra Lucas','San Martin 555','Cruz del Eje',1);
 insert into clientes values (6,'Gomez Ines','San Martin 666','Santa Fe',2);
 insert into clientes values (7,'Torres Fabiola','Alem 777','Ibera',3);
 insert into clientes values (8,'Garcia Paco','Avellaneda 888','Rawson',5);

 select c.nombre,domicilio,ciudad,p.nombre
  from clientes c
  join provincias p
  on c.codigoprovincia=p.codigo;

 select c.nombre,domicilio,ciudad,p.nombre
  from clientes c
  join provincias p
  on c.codigoprovincia=p.codigo
  order by p.nombre;

 select c.nombre,domicilio,ciudad
  from clientes c
  join provincias p
  on c.codigoprovincia=p.codigo
  where p.nombre='Santa Fe';

 

Segundo problema:

Un club dicta clases de distintos deportes. Almacena la información en una tabla llamada "inscriptos" que incluye el documento, el nombre, el deporte y si la matricula esta paga o no y una tabla llamada "inasistencias" que incluye el documento, el deporte y la fecha de la inasistencia.

1- Elimine las tablas y créelas:

 drop table inscriptos;
 drop table inasistencias;

 create table inscriptos(
  nombre varchar2(30),
  documento char(8),
  deporte varchar2(15),
  matricula char(1), --'s'=paga; 'n'=impaga
  primary key(documento,deporte)
 );

 create table inasistencias(
  documento char(8),
  deporte varchar2(15),
  fecha date
 );

2- Ingrese algunos registros para ambas tablas:

 insert into inscriptos values('Juan Perez','22222222','tenis','s');
 insert into inscriptos values('Maria Lopez','23333333','tenis','s');
 insert into inscriptos values('Agustin Juarez','24444444','tenis','n');
 insert into inscriptos values('Marta Garcia','25555555','natacion','s');
 insert into inscriptos values('Juan Perez','22222222','natacion','s');
 insert into inscriptos values('Maria Lopez','23333333','natacion','n');

 insert into inasistencias values('22222222','tenis','01/12/2006');
 insert into inasistencias values('22222222','tenis','08/12/2006');
 insert into inasistencias values('23333333','tenis','01/12/2006');
 insert into inasistencias values('24444444','tenis','08/12/2006');
 insert into inasistencias values('22222222','natacion','02/12/2006');
 insert into inasistencias values('23333333','natacion','02/12/2006');

3- Muestre el nombre, el deporte y las fechas de inasistencias, ordenado por nombre y deporte.

Note que la condición es compuesta porque para identificar los registros de la tabla "inasistencias" necesitamos ambos campos.
Note que la persona con documento '25555555' no aparece en la consulta porque no está presente en "inasistencias".

4- Obtenga el nombre, deporte y las fechas de inasistencias de un determinado inscripto en un determinado deporte (3 registros).

5- Obtenga el nombre, deporte y las fechas de inasistencias de todos los inscriptos que pagaron la matrícula (4 registros)


Ver solución
  drop table inscriptos;
  drop table inasistencias;

 create table inscriptos(
  nombre varchar2(30),
  documento char(8),
  deporte varchar2(15),
  matricula char(1), --'s'=paga; 'n'=impaga
  primary key(documento,deporte)
 );

 create table inasistencias(
  documento char(8),
  deporte varchar2(15),
  fecha date
 );

 insert into inscriptos values('Juan Perez','22222222','tenis','s');
 insert into inscriptos values('Maria Lopez','23333333','tenis','s');
 insert into inscriptos values('Agustin Juarez','24444444','tenis','n');
 insert into inscriptos values('Marta Garcia','25555555','natacion','s');
 insert into inscriptos values('Juan Perez','22222222','natacion','s');
 insert into inscriptos values('Maria Lopez','23333333','natacion','n');

 insert into inasistencias values('22222222','tenis','01/12/2006');
 insert into inasistencias values('22222222','tenis','08/12/2006');
 insert into inasistencias values('23333333','tenis','01/12/2006');
 insert into inasistencias values('24444444','tenis','08/12/2006');
 insert into inasistencias values('22222222','natacion','02/12/2006');
 insert into inasistencias values('23333333','natacion','02/12/2006');

 select nombre,insc.deporte,ina.fecha
  from inscriptos insc
  join inasistencias ina
  on insc.documento=ina.documento and
  insc.deporte=ina.deporte
  order by nombre, insc.deporte;

 select nombre,insc.deporte, ina.fecha
  from inscriptos insc
  join inasistencias ina
  on insc.documento=ina.documento and
  insc.deporte=ina.deporte
  where insc.documento='22222222';

 select nombre,insc.deporte, ina.fecha
  from inscriptos insc
  join inasistencias ina
  on insc.documento=ina.documento and
  insc.deporte=ina.deporte
  where insc.matricula='s';

Retornar