74 - Subconsultas con in


Problema:

Trabajamos con las tablas "libros" y "editoriales" de una librería.
Eliminamos las tablas y las creamos:

 drop table libros;
 drop table editoriales;

 create table editoriales(
  codigo number(3),
  nombre varchar2(30),
  primary key (codigo)
 );
 
 create table libros (
  codigo number(5),
  titulo varchar2(40),
  autor varchar2(30),
  codigoeditorial number(3),
  primary key(codigo),
 constraint FK_libros_editorial
   foreign key (codigoeditorial)
   references editoriales(codigo)
 );

Ingresamos algunos registros:

 insert into editoriales values(1,'Planeta');
 insert into editoriales values(2,'Emece');
 insert into editoriales values(3,'Paidos');
 insert into editoriales values(4,'Siglo XXI');

 insert into libros values(100,'Uno','Richard Bach',1);
 insert into libros values(101,'Ilusiones','Richard Bach',1);
 insert into libros values(102,'Aprenda PHP','Mario Molina',4);
 insert into libros values(103,'El aleph','Borges',2);
 insert into libros values(104,'Puente al infinito','Richard Bach',2);

Queremos conocer el nombre de las editoriales que han publicado libros del autor "Richard Bach":

 select nombre
  from editoriales
  where codigo in
   (select codigoeditorial
     from libros
     where autor='Richard Bach');

Probamos la subconsulta separada de la consulta exterior para verificar que retorna una lista de valores de un solo campo:

 select codigoeditorial
  from libros
  where autor='Richard Bach';

Podemos reemplazar por un "join" la primera consulta:

 select distinct nombre
  from editoriales e
  join libros
  on codigoeditorial=e.codigo
  where autor='Richard Bach';

También podemos buscar las editoriales que no han publicado libros de "Richard Bach":

 select nombre
  from editoriales
  where codigo not in
   (select codigoeditorial
     from libros
     where autor='Richard Bach');

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

 drop table libros;
 drop table editoriales;

 create table editoriales(
  codigo number(3),
  nombre varchar2(30),
  primary key (codigo)
 );
 
 create table libros (
  codigo number(5),
  titulo varchar2(40),
  autor varchar2(30),
  codigoeditorial number(3),
  primary key(codigo),
 constraint FK_libros_editorial
   foreign key (codigoeditorial)
   references editoriales(codigo)
 );

 insert into editoriales values(1,'Planeta');
 insert into editoriales values(2,'Emece');
 insert into editoriales values(3,'Paidos');
 insert into editoriales values(4,'Siglo XXI');

 insert into libros values(100,'Uno','Richard Bach',1);
 insert into libros values(101,'Ilusiones','Richard Bach',1);
 insert into libros values(102,'Aprenda PHP','Mario Molina',4);
 insert into libros values(103,'El aleph','Borges',2);
 insert into libros values(104,'Puente al infinito','Richard Bach',2);

 -- Queremos conocer el nombre de las editoriales que han publicado libros
 -- del autor "Richard Bach":
 select nombre
  from editoriales
  where codigo in
   (select codigoeditorial
     from libros
     where autor='Richard Bach');

 -- Probamos la subconsulta separada de la consulta exterior para verificar
 -- que retorna una lista de valores de un solo campo:
 select codigoeditorial
  from libros
  where autor='Richard Bach';

-- Podemos reemplazar por un "join" la primera consulta:
 select distinct nombre
  from editoriales e
  join libros
  on codigoeditorial=e.codigo
  where autor='Richard Bach';

-- También podemos buscar las editoriales que no han publicado libros de "Richard Bach":
 select nombre
  from editoriales
  where codigo not in
   (select codigoeditorial
     from libros
     where autor='Richard Bach');

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

SQL Developer subconsulta in


Retornar