SELECT i.Nombre FROM INVESTIGADOR i INNER JOIN ASIGNADO_A a USING(DNI_Investigador) INNER JOIN PROYECTO p USING(Código_Proyecto) GROUP BY i.DNI_Investigador HAVING COUNT(DISTINCT a.Codigo_Proyecto) = SELECT COUNT(DISTINCT p.Codigo_Proyecto) FROM PROYECTO
No la he probado.
Creo que otra opción más eficiente sería con un doble anidamiento de NON EXISTS.
Este es un ejemplo sacado del manual de MySqL
Cita: •¿Qué clase de tienda hay en todas las ciudades?
SELECT DISTINCT store_type FROM Stores S1
WHERE NOT EXISTS (
SELECT * FROM Cities WHERE NOT EXISTS (
SELECT * FROM Cities_Stores
WHERE Cities_Stores.city = Cities.city
AND Cities_Stores.store_type = Stores.store_type));
El último ejemplo es un doblemente anidado NOT EXISTS . Esto es, tiene una cláusula NOT EXISTS dentro de otra NOT EXISTS. Formalmente, responde a la pregunta “¿existe una ciudad con una tienda que no esté en Stores?” Sin embargo, es más fácil decir que un NOT EXISTS responde a la pregunta “¿es x TRUE para todo y?”
Haz alguna prueba y creo que lo sacarás