67 - Minus


Problema:

Una academia de enseñanza de idiomas da clases de inglés y frances; almacena los datos de los alumnos que estudian inglés en una tabla llamada "ingles" y los que están inscriptos en "francés" en una tabla denominada "frances".

Eliminamos las tablas:

 drop table ingles;
 drop table frances;

Creamos las tablas:

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

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

Ingresamos algunos registros:

 insert into ingles values('20111222','Ana Acosta','Avellaneda 111');
 insert into ingles values('21222333','Betina Bustos','Bulnes 222');
 insert into ingles values('22333444','Carlos Caseros','Colon 333');
 insert into ingles values('23444555','Daniel Duarte','Duarte Quiros 444');
 insert into ingles values('24555666','Estela Esper','Esmeralda 555');

 insert into frances values('23444555','Daniel Duarte','Duarte Quiros 444');
 insert into frances values('24555666','Estela Esper','Esmeralda 555');
 insert into frances values('30111222','Fabiana Fuentes','Famatina 666');
 insert into frances values('30222333','Gaston Gonzalez','Guemes 777');

La academia necesita el nombre y domicilio de todos los alumnos que cursan solamente inglés (no presentes en la tabla "frances") para enviarles publicidad referida al curso de francés. Empleamos el operador "minus" para obtener dicha información:

 select nombre, domicilio from ingles
  minus 
 select nombre,domicilio from frances;

El resultado muestra los registros de la primer consulta que NO coinciden con ningún registro de la segunda consulta.

Los registros presentes en ambas tablas (Daniel Duarte y Estela Esper), no aparecen en el resultado final.

La academia necesita el nombre y domicilio de todos los alumnos que cursan solamente francés (no presentes en la tabla "ingles") para enviarles publicidad referida al curso de inglés. Empleamos el operador "minus" para obtener dicha información:

 select nombre, domicilio from frances
  minus 
 select nombre,domicilio from ingles;

El resultado muestra los registros de la primer consulta que NO coinciden con ningún registro de la segunda consulta. Los registros presentes en ambas tablas (Daniel Duarte y Estela Esper), no aparecen en el resultado final.

Si queremos los alumnos que cursan un solo idioma (registros de "ingles" y de "frances" que no coinciden), podemos unir ambas tablas y luego restarle la intersección:

 select nombre from ingles
  union
 select nombre from frances
  minus
 (select nombre from ingles
  intersect
 select nombre from frances);

Podemos obtener el mismo resultado anterior con la siguiente consulta en la cual se buscan los registros de "ingles" que no coinciden con "frances" y los registros de "frances" que no coinciden con "ingles" y luego se unen ambos resultados:

 select nombre from ingles
  minus
 select nombre from frances
  union
 (select nombre from frances
  minus
 select nombre from ingles);

Ingresemos el siguiente lote de comandos en el Oracle SQL Developer:

 drop table ingles;
 drop table frances;

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

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

 insert into ingles values('20111222','Ana Acosta','Avellaneda 111');
 insert into ingles values('21222333','Betina Bustos','Bulnes 222');
 insert into ingles values('22333444','Carlos Caseros','Colon 333');
 insert into ingles values('23444555','Daniel Duarte','Duarte Quiros 444');
 insert into ingles values('24555666','Estela Esper','Esmeralda 555');

 insert into frances values('23444555','Daniel Duarte','Duarte Quiros 444');
 insert into frances values('24555666','Estela Esper','Esmeralda 555');
 insert into frances values('30111222','Fabiana Fuentes','Famatina 666');
 insert into frances values('30222333','Gaston Gonzalez','Guemes 777');

 select nombre, domicilio from ingles
  minus 
 select nombre,domicilio from frances;

 select nombre, domicilio from frances
  minus 
 select nombre,domicilio from ingles;

 select nombre from ingles
  union
 select nombre from frances
  minus
 (select nombre from ingles
  intersect
 select nombre from frances);

 select nombre from ingles
  minus
 select nombre from frances
  union
 (select nombre from frances
  minus
 select nombre from ingles);

La ejecución de este lote de comandos SQL genera una salida similar a:

SQL Developer minus


Retornar