65 - Unión


Primer problema:

Una clínica almacena los datos de los médicos en una tabla llamada "medicos" y los datos de los pacientes en otra denominada "pacientes".

1- Eliminamos ambas tablas:

 drop table medicos;
 drop table pacientes;

2- Creamos las tablas:

 create table medicos(
  legajo number(3),
  documento varchar2(8) not null,
  nombre varchar2(30),
  domicilio varchar2(30),
  especialidad varchar2(30),
  primary key(legajo)
 );

 create table pacientes(
  documento varchar2(8) not null,
  nombre varchar2(30),
  domicilio varchar2(30),
  obrasocial varchar2(20),
  primary key(documento)
 );

3- Ingresamos algunos registros:

 insert into medicos values(1,'20111222','Ana Acosta','Avellaneda 111','clinica');
 insert into medicos values(2,'21222333','Betina Bustos','Bulnes 222','clinica');
 insert into medicos values(3,'22333444','Carlos Caseros','Colon 333','pediatria');
 insert into medicos values(4,'23444555','Daniel Duarte','Duarte Quiros 444','oculista');
 insert into medicos values(5,'24555666','Estela Esper','Esmeralda 555','alergia');

 insert into pacientes values('24555666','Estela Esper','Esmeralda 555','IPAM');
 insert into pacientes values('23444555','Daniel Duarte','Duarte Quiros 444','OSDOP');
 insert into pacientes values('30111222','Fabiana Fuentes','Famatina 666','PAMI');
 insert into pacientes values('31222333','Gaston Gonzalez','Guemes 777','PAMI');

4- La clínica necesita el nombre y domicilio de médicos y pacientes para enviarles una tarjeta de invitación a la inauguración de un nuevo establecimiento. Emplee el operador "union" para obtener dicha información de ambas tablas (7 registros)
Note que existen dos médicos que también están presentes en la tabla "pacientes"; tales registros aparecen una sola vez en el resultado de "union".

5- Realice la misma consulta anterior pero esta vez, incluya los registros duplicados. Emplee "union all" (9 registros)

6- Realice la misma consulta anterior y esta vez ordene el resultado por nombre (9 registros)

7- Agregue una columna extra a la consulta con el encabezado "condicion" en la que aparezca el literal "médico" o "paciente" según si la persona es uno u otro (9 registros)

Ver solución

 drop table medicos;
 drop table pacientes;

 create table medicos(
  legajo number(3),
  documento varchar2(8) not null,
  nombre varchar2(30),
  domicilio varchar2(30),
  especialidad varchar2(30),
  primary key(legajo)
 );

 create table pacientes(
  documento varchar2(8) not null,
  nombre varchar2(30),
  domicilio varchar2(30),
  obrasocial varchar2(20),
  primary key(documento)
 );

 insert into medicos values(1,'20111222','Ana Acosta','Avellaneda 111','clinica');
 insert into medicos values(2,'21222333','Betina Bustos','Bulnes 222','clinica');
 insert into medicos values(3,'22333444','Carlos Caseros','Colon 333','pediatria');
 insert into medicos values(4,'23444555','Daniel Duarte','Duarte Quiros 444','oculista');
 insert into medicos values(5,'24555666','Estela Esper','Esmeralda 555','alergia');

 insert into pacientes values('24555666','Estela Esper','Esmeralda 555','IPAM');
 insert into pacientes values('23444555','Daniel Duarte','Duarte Quiros 444','OSDOP');
 insert into pacientes values('30111222','Fabiana Fuentes','Famatina 666','PAMI');
 insert into pacientes values('31222333','Gaston Gonzalez','Guemes 777','PAMI');

 select nombre, domicilio from medicos
  union
  select nombre, domicilio from pacientes;

 select nombre, domicilio from medicos
  union all
  select nombre, domicilio from pacientes;

 select nombre, domicilio from medicos
  union all
   select nombre, domicilio from pacientes
  order by nombre;

 select nombre, domicilio, 'médico' as condicion from medicos
  union
   select nombre, domicilio,'paciente' from pacientes
  order by condicion;

 

Segundo problema:

Un supermercado almacena en una tabla denominada "proveedores" los datos de las compañías que le proveen de mercaderías; en una tabla llamada "clientes", los datos de los comercios que le compran y en otra tabla "empleados" los datos de los empleados.

1- Elimine las tablas:

 drop table clientes;
 drop table proveedores;
 drop table empleados;

2- Cree las tablas:

 create table proveedores(
  codigo number(3) not null,
  nombre varchar2(30),
  domicilio varchar2(30),
  primary key(codigo)
 );
 create table clientes(
  codigo number(4),
  nombre varchar2(30),
  domicilio varchar2(30),
  primary key(codigo)
 );
 create table empleados(
  documento char(8) not null,
  nombre varchar2(20),
  apellido varchar2(20),
  domicilio varchar2(30),
  primary key(documento)
 );

3- Ingrese algunos registros:

 insert into proveedores values(1,'Golosinas Dulce','Colon 123');
 insert into proveedores values(2,'Carnes Unica','Caseros 222');
 insert into proveedores values(3,'Lacteos Blanca','San Martin 987');
 insert into proveedores values(4,'Luis Luque','San Martin 1234');
 insert into clientes values(100,'Supermercado Lopez','Avellaneda 34');
 insert into clientes values(101,'Almacen Anita','Colon 987');
 insert into clientes values(102,'Juan Garcia','Sucre 345');
 insert into clientes values(103,'Luis Luque','San Martin 1234');
 insert into empleados values('23333333','Federico','Lopez','Colon 987');
 insert into empleados values('28888888','Ana','Marquez','Sucre 333');
 insert into empleados values('30111111','Pedro','Perez','Caseros 956');
 insert into empleados values('31222333','Juan','Garcia','Sucre 345');

4- El supermercado quiere enviar una tarjeta de salutación a todos los proveedores, clientes y empleados y necesita el nombre y domicilio de todos ellos. Emplee el operador "union" para obtener dicha información de las tres tablas. Ordene la información por nombre. La consulta a la tabla "empleados" debe incluir el nombre y el apellido (10 registros)

5- Realice la misma operación de unión anterior, pero ahora incluya los registros duplicados y ordénelos por nombre (12 registros)
Note que "Luis Luque" es proveedor y cliente y que "Juan Garcia" es cliente y empleado; por lo tanto ambos aparecen 2 veces.

6- Realice la misma consulta anterior y agregue una columna con un literal para indicar si es un proveedor, un cliente o un empleado(12 registros)


Ver solución
 drop table clientes;
 drop table proveedores;
 drop table empleados;

 create table proveedores(
  codigo number(3) not null,
  nombre varchar2(30),
  domicilio varchar2(30),
  primary key(codigo)
 );
 create table clientes(
  codigo number(4),
  nombre varchar2(30),
  domicilio varchar2(30),
  primary key(codigo)
 );
 create table empleados(
  documento char(8) not null,
  nombre varchar2(20),
  apellido varchar2(20),
  domicilio varchar2(30),
  primary key(documento)
 );

 insert into proveedores values(1,'Golosinas Dulce','Colon 123');
 insert into proveedores values(2,'Carnes Unica','Caseros 222');
 insert into proveedores values(3,'Lacteos Blanca','San Martin 987');
 insert into proveedores values(4,'Luis Luque','San Martin 1234');
 insert into clientes values(100,'Supermercado Lopez','Avellaneda 34');
 insert into clientes values(101,'Almacen Anita','Colon 987');
 insert into clientes values(102,'Juan Garcia','Sucre 345');
 insert into clientes values(103,'Luis Luque','San Martin 1234');
 insert into empleados values('23333333','Federico','Lopez','Colon 987');
 insert into empleados values('28888888','Ana','Marquez','Sucre 333');
 insert into empleados values('30111111','Pedro','Perez','Caseros 956');
 insert into empleados values('31222333','Juan','Garcia','Sucre 345');

 select nombre, domicilio from proveedores
  union
  select nombre, domicilio from clientes
   union
   select nombre||' '||apellido, domicilio from empleados
  order by nombre;

 select nombre, domicilio from proveedores
  union all
  select nombre, domicilio from clientes
   union all
   select nombre||' '||apellido, domicilio from empleados
  order by nombre;

 select nombre, domicilio, 'proveedor' as categoria from proveedores
  union all
  select nombre, domicilio, 'cliente' from clientes
   union all
   select nombre||' '||apellido, domicilio, 'empleado' from empleados;

Retornar