SQL - pregunta en consulta

   
Vista:

pregunta en consulta

Publicado por Mauro (2 intervenciones) el 12/02/2012 23:07:22
Buenas, dispongo de las siguientes tablas

Congreso = (IdCongreso(PK), Nombre, Fecha_Inicio, Fecha_Fin)
Área = (IdArea(PK), Nombre, Descripción)
Posee = (IdCongreso(PK), IdArea(PK))
Artículo = (IdArtículo(PK), Título, Cantidad_Hojas, Fecha_Recepción, IdArea, IdCongreso)
Autor = (Dni(PK), Nombre, Apellido)
Escribe = (IdArtículo(PK), Dni(PK))

PK = Primary Key.

Me pide lo siguiente

Listar el nombre y apellido de aquellos autores que presentaron artículos en el congreso “WICC
2009” pero que no hayan presentado en el congreso “TE&ET 2009”

La consulta la puedo resolver utilizando la cláusula EXCEPT.

SELECT au.Nombre,au.Apellido
FROM Congreso c INNER JOIN Articulo art ON (c.idCongreso = art.idCongreso)
INNER JOIN Escribe e ON(art.idArticulo = e.idArticulo)
INNER JOIN Autor au ON(au.Dni = e.Dni)
WHERE(c.Nombre = 'WICC2009')

EXCEPT

SELECT au.Nombre,au.Apellido
FROM Congreso c INNER JOIN Articulo art ON (c.idCongreso = art.idCongreso)
INNER JOIN Escribe e ON(art.idArticulo = e.idArticulo)
INNER JOIN Autor au ON(au.Dni = e.Dni)
WHERE(c.Nombre = 'TE&ET2009')

Estoy usando Open Office y el EXCEPT no me funciona.

Así que hice la consulta de esta manera

SELECT au.Nombre,au.Apellido
FROM Congreso c INNER JOIN Articulo art ON (c.idCongreso = art.idCongreso)
INNER JOIN Escribe e ON(art.idArticulo = e.idArticulo)
INNER JOIN Autor au ON(au.Dni = e.Dni)
WHERE(c.Nombre = 'WICC2009' AND c.Nombre NOT IN (SELECT Nombre
FROM Congreso
WHERE Nombre = 'TE&ET2009'))
ORDER BY au.Nombre

Quería saber si esta consulta es equivalente a la anterior es decir si cumple con lo que dice el enunciado, es una práctica previa del examen que tengo en unos días, así que si me pueden responder se los agradecería mucho
Saludos!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

pregunta en consulta

Publicado por leonardo_josue (877 intervenciones) el 17/02/2012 17:27:33
Hola Mauro:

No mencionas qué DBMS estás manejando, pero te recomiendo que revises si este maneja algún equivalente para la función EXCEPT (por ejemplo MINUS, INTERSECT, etc) en el último de los casos puedes simularlo con una función NOT EXISTS...

Hay un problema con la forma en que estás haciendo la consulta, ya que por lo que puedo ver el filtro por nombre toma en consideración dos campos (au.Nombre,au.Apellido), mientras que en la condición NOT IN sólo estás filtrando por uno de ellos (c.Nombre NOT IN (SELECT Nombre))

Para este caso, debes utilizar la cláusula NOT EXISTS, ya que esta te permite evaluar todos los campos que quieras... no mencionas qué BD estás manejando, pero debería soportarla... tomando como base la primer consulta que pones debería quedar más o menos así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT au.Nombre,au.Apellido
FROM Congreso c INNER JOIN Articulo art ON (c.idCongreso = art.idCongreso)
INNER JOIN Escribe e ON(art.idArticulo = e.idArticulo)
INNER JOIN Autor au ON(au.Dni = e.Dni)
WHERE(c.Nombre = 'WICC2009') AND
NOT EXISTS
(
SELECT au2.Nombre,au2.Apellido
FROM Congreso c INNER JOIN Articulo art ON (c.idCongreso = art.idCongreso)
INNER JOIN Escribe e ON(art.idArticulo = e.idArticulo)
INNER JOIN Autor au2 ON(au.Dni = e.Dni)
WHERE(c.Nombre = 'TE&ET2009')
and
ua.nombre = ua2.nombre and
ua.apellido = ua2.apellido
)


Esto es una aproximación, no he probado la consulta, pero creo que debería funcionar. Observa que en la consulta interior pongo otro alias para la tabla Autor (ua2) y que agrego dos condiciones de igualación para relacionarla con la tabla externa (ua)...

Te recomiendo que le des un vistazo a cómo funciona la cláusula EXISTS y puedes checar también este foro:

http://www.forosdelweb.com/f86/restas-sumas-resultados-busquedas-947641/

Ahí se plantea algo similar a lo que quieres.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar