Por ejemplo: "Listar solo los alumnos que hayan cursado todas las materias"
Imaginense que tenemos las siguientes tablas:
PERSONA = (DNI, Apellido, Nombre, Fecha_Nacimiento, Estado_Civil, Genero)
ALUMNO = (DNI, Legajo, Año_Ingreso)
PROFESOR = (DNI, Matricula, Nro_Expediente)
TITULO = (Cod_Titulo, Nombre, Descripción)
TITULO-PROFESOR = (Cod_Titulo, DNI, Fecha)
CURSO = (Cod_Curso, Nombre, Descripción, Fecha_Creacion, Duracion)
ALUMNO-CURSO = (DNI, Cod_Curso, Año, Desempeño, Calificación)
PROFESOR-CURSO = (DNI, Cod_Curso, Fecha_Desde, Fecha_Hasta)
Una de mis soluciones fue esta:
Código:
SELECT P.DNI, P.NOMBRE, P.APELLIDO
FROM PERSONA P
INNER JOIN ALUMNOCURSO AC ON (P.DNI = AC.DNI)
GROUP BY P.DNI, P.NOMBRE, P.APELLIDO
HAVING ((COUNT(DISTINCT AC.COD_CURSO))=(SELECT COUNT(DISTINCT AC.COD_CURSO) FROM ALUMNOCURSO AC))
FROM PERSONA P
INNER JOIN ALUMNOCURSO AC ON (P.DNI = AC.DNI)
GROUP BY P.DNI, P.NOMBRE, P.APELLIDO
HAVING ((COUNT(DISTINCT AC.COD_CURSO))=(SELECT COUNT(DISTINCT AC.COD_CURSO) FROM ALUMNOCURSO AC))
A lo que mi profesor respondio:
Bueno el caso, como muchos de ustedes, conocedores de SQL deben darse cuenta es que es extemadamente ineficiente. Me recomendaron que lo hiciera mediante diferencia de conjuntos, sacar el conjunto de alumnos que no han cursado ninguna materia y restarselo al conjunto general de alumnos, lo que me daría por resultado el conjunto de alumnos que han cursado todas las materias.
En el momento no me di cuenta, pero, ¿Acaso haciendo así no obtendríamos el conjunto de alumnos que han cursado por lo menos una materia?
Y si estoy en lo correcto, ¿Cual seria la manera mas eficiente de hacerlo?
Desde ya muchas gracias por su tiempo y por haberse detenido a leer.