74 - Subconsultas con in |
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');
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: