56 - Otros tipos de combinaciones


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" y créelas:

 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(
  codigoprovincia number(2),
  nombre varchar2(20)
 );

2- 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,'Salta');

 insert into clientes values (100,'Lopez Marcos','Colon 111','Córdoba',1);
 insert into clientes values (101,'Perez Ana','San Martin 222','Cruz del Eje',1);
 insert into clientes values (102,'Garcia Juan','Rivadavia 333','Villa Maria',1);
 insert into clientes values (103,'Perez Luis','Sarmiento 444','Rosario',2);
 insert into clientes values (104,'Gomez Ines','San Martin 666','Santa Fe',2);
 insert into clientes values (105,'Torres Fabiola','Alem 777','La Plata',4);
 insert into clientes values (106,'Garcia Luis','Sucre 475','Santa Rosa',null);

3- Muestre todos los datos de los clientes, incluido el nombre de la provincia empleando un "left join" (7 filas)

4- Obtenga la misma salida que la consulta anterior pero empleando un "join" con el modificador (+)

Note que en los puntos 3 y 4, los registros "Garcia Luis" y "Torres Fabiola" aparecen aunque no encuentran coincidencia en "provincias", mostrando "null" en la columna "provincia".

5- Muestre todos los datos de los clientes, incluido el nombre de la provincia empleando un "right join" para que las provincias de las cuales no hay clientes también aparezcan en la consulta (7 filas)

6- Obtenga la misma salida que la consulta anterior pero empleando un "join" con el modificador (+)

Note que en los puntos 5 y 6, las provincias "Salta" y "Corrientes" aparecen aunque no encuentran coincidencia en "clientes", mostrando "null" en todos los campos de tal tabla.

7- Intente colocar en una consulta "join", el modificador "(+)" en ambos campos del enlace (mensaje de error)

8- Intente realizar un natural join entre ambas tablas mostrando el nombre del cliente, la ciudad y nombre de la provincia (las tablas tienen 2 campos con igual nombre "codigoprovincia" y "nombre"; mensaje de error)

9- Realice una combinación entre ambas tablas empleando la cláusula "using" (5 filas)

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(
  codigoprovincia 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,'Salta');

 insert into clientes values (100,'Lopez Marcos','Colon 111','Córdoba',1);
 insert into clientes values (101,'Perez Ana','San Martin 222','Cruz del Eje',1);
 insert into clientes values (102,'Garcia Juan','Rivadavia 333','Villa Maria',1);
 insert into clientes values (103,'Perez Luis','Sarmiento 444','Rosario',2);
 insert into clientes values (104,'Gomez Ines','San Martin 666','Santa Fe',2);
 insert into clientes values (105,'Torres Fabiola','Alem 777','La Plata',4);
 insert into clientes values (106,'Garcia Luis','Sucre 475','Santa Rosa',null);

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

 select c.nombre,domicilio,ciudad, p.nombre as provincia
  from clientes c
  join provincias p
  on c.codigoprovincia = p.codigoprovincia(+);

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

 select c.nombre,domicilio,ciudad, p.nombre as provincia
  from clientes c
  join provincias p
  on c.codigoprovincia(+)= p.codigoprovincia;

 select c.nombre,domicilio,ciudad, p.nombre as provincia
  from clientes c
  join provincias p
  on codigoprovincia(+)= p.codigo(+);

 select c.nombre,ciudad,p.nombre as provincia
  from clientes c
  natural join
  provincias p;

 select c.nombre,ciudad,p.nombre as provincia
  from clientes c
  join provincias p
  using (codigoprovincia);

 

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/2016');
 insert into inasistencias values('22222222','tenis','08/12/2016');
 insert into inasistencias values('23333333','tenis','01/12/2016');
 insert into inasistencias values('24444444','tenis','08/12/2016');
 insert into inasistencias values('22222222','natacion','02/12/2016');
 insert into inasistencias values('23333333','natacion','02/12/2016');

3- Muestre toda la información de "inscriptos", realizando una combinación con "inasistencias". Realice un "left join" para incluir todos los "inscriptos" aunque no se encuentren en "inasistencias" (7 filas)

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

4- Obtenga el mismo resultado anterior empleando un "join" y el modificador "(+)" (7 filas)

Note que se coloca el modificador en ambos campos. Si se omite en alguno de ellos, el resultado será diferente (6 filas)

5- Intente realizar un natural join entre ambas tablas mostrando el nombre del inscripto, el deporte y la fecha de inasistencia (mensaje de error porque hay 2 campos con igual nombre)

6- Realice una combinación entre ambas tablas mostrando toda la información y empleando la cláusula "using" (6 filas)


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/2016');
 insert into inasistencias values('22222222','tenis','08/12/2016');
 insert into inasistencias values('23333333','tenis','01/12/2016');
 insert into inasistencias values('24444444','tenis','08/12/2016');
 insert into inasistencias values('22222222','natacion','02/12/2016');
 insert into inasistencias values('23333333','natacion','02/12/2016');

 select ins.documento,nombre,ins.deporte,ina.fecha
  from inscriptos ins
  left join inasistencias ina
  on ins.documento=ina.documento and
  ins.deporte=ina.deporte;

 select ins.documento,nombre,ins.deporte,ina.fecha
  from inscriptos ins
  join inasistencias ina
  on ins.documento=ina.documento(+) and
  ins.deporte=ina.deporte(+);

 select ins.documento,nombre,ins.deporte,ina.fecha
  from inscriptos ins
  join inasistencias ina
  on ins.documento=ina.documento(+) and
  ins.deporte=ina.deporte;

 select nombre,ins.deporte,fecha
  from inscriptos ins
  natural join
  inasistencias ina;

 select * from inscriptos ins
  join inasistencias ina
  using (documento,deporte);


Retornar