Hola.
Tengo la siguiente base de datos:
El enunciado del problema a resolver es el siguiente:
Obtener el dorsal y el nombre de los ciclistas tales que todas las etapas que
han ganado tienen más de 170 km (es decir que sólo han ganado etapas de
más de 170 km).
He probado con la siguiente consulta:
SELECT C.nombre, C.dorsal, COUNT(*)
FROM ciclista C JOIN etapa E USING(dorsal)
WHERE E.netapa not in (SELECT netapa FROM etapa WHERE km <= 170)
GROUP BY C.nombre
HAVING COUNT(*) = (SELECT count(*) FROM etapa WHERE km > 170);
Pero claro esto no me sirve puesto que a pesar de que cuenta a aquellos ciclistas que han ganado etapas con más de $$170KM$$, no tiene en cuenta que estos también han podido ganar etapas con menos de $$170KM$$. He pensado que podría hacer una consulta en la que obtenga el conjunto de aquellos ciclistas que han ganado etapas con más de $$170KM$$ y restarle el conjunto de los ciclistas que solo han ganado etapas de menos de $$170KM(*)$$, ¿funcionaría esto?¿Tiene alguien alguna otra idea?
Código con diferencia de conjuntos (*)
SELECT C.nombre, C.dorsal
FROM ciclista C JOIN etapa E USING(dorsal)
WHERE E.km > 170
MINUS
SELECT C2.nombre, C2.dorsal
FROM ciclista C2 JOIN etapa E2 USING(dorsal)
WHERE E2.km <= 170
Mucha gracias de antemano.
Un saludo.