Mostrar todos los registros que cumplan una condición de otra tabla SQL

publicado por: Anonymous

Buenas amigos de stack, estoy volviendome loco con una consulta SQL, les dejo aqui todo el esquema etc.

Paises(**paisId**, paisNombre, paisCodigo)

Jugadores(**jugadorId**, nombre, fechaNacimiento, paisNacimiento, paisResidencia,
 estatura, peso, juego, entrenador, profesionalDesde, partidosGanados,
 partidosPerdidos, titulosGanados, premiosGanados)

Torneos(**torneoId**, torneoNombre, torneoTipo, torneoSuperficie,
 torneoPrimeraEdicion, torneoPais)

TorneoEdicion(**torneoId**, **anio**, jugadorGanador, finalista, premioGanador,
 premiosTotales, fechaComienzo, fechaFin)

Partidos(**jugadorGanador, jugadorPerdedor, torneoId, anio, torneoInstancia**,
 marcador)

Como pueden ver cada torneo tiene un tipo de superficie que con un check valida, que puede ser “A”,”C”,”P”

Este es el requerimiento

Devolver el nombre de los jugadores que hayan ganado torneos en todas
las superficies.

No se como hacer para que se muestren todos, me cuesta explicarlo, pero es como que necesito una clausula “IN” pero que sea “estricta” por llamarlo de alguna manera es decir que me muestre todos lo que cumplan esa condición, si no ninguno.

Actualmente tengo esto pero no funciona ni cerca

SELECT DISTINCT(Jugadores.nombre)
FROM Jugadores, Torneos, TorneoEdicion
WHERE
Jugadores.jugadorId = TorneoEdicion.jugadorGanador AND
Torneos.torneoId = TorneoEdicion.torneoId 
GROUP BY Jugadores.nombre
HAVING Torneos.torneoSuperficie = ALL (SELECT DISTINCT torneoSuperficie FROM Torneos);

solución

Como no tenemos datos de prueba para esto, vamos a probar hacerlo a ojito.

Primero, unimos las tablas Torneos con TorneoEdicion, de esta forma, obtenemos todos los ganadores de torneos y las superficies.

Select jugadorGanador, torneoSuperficie
From TorneoEdicion te inner join Torneos t on t.torneoId = te.torneoId

Ahora, agarramos eso, y le hacemos un distinc, te tal forma que solo nos queda una fila por jugador superficie.

Select distinc * 
From (la consulta anterior)

Y ahora, agarramos eso, lo agrupamos por jugador, y hacemos un count de superficies, de tal forma que si da 3 es que gano en todas las superficies.

Select jugadorGanador, Count(torneoSuperficie)
From (la consulta anterior)
group by jugadorGanador
Having Count(torneoSuperficie) = 3

De esta forma, deberias obtener solo los ganadores.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *