Intentando convertir un NOT EXIST en COUNT

Entonces sé cómo hacer la consulta utilizando NOT EXIST . Pero parece que no puedo encontrar el equivalente utilizando COUNT lugar.

Estructura:

 player(playerID: integer, playerName: string) team(teamID: integer, teamName: string, sport: string) plays(playerID: integer, teamID: integer) 

La consulta NOT EXIST que surgió que funciona:

 SELECT distinct player.playerID, playerName FROM player, plays WHERE NOT EXISTS (SELECT teamID FROM team WHERE sport='football' AND NOT EXISTS (SELECT teamID FROM plays WHERE team.teamID=plays.teamID AND player.playerid=plays.playerid)); 

La consulta encuentra un jugador que juega para todos los equipos de fútbol. Estoy tratando de hacer lo mismo con el uso de contar. Para comenzar, sé que tengo que contar la cantidad de veces que el fútbol aparece en los deportes y luego ese jugador tiene que jugar para todos los TeamID para los que el deporte es fútbol. Me confundo después de eso. ¿Algún consejo?

Lo que parece que está buscando es una consulta que recupera todos los jugadores HAVING COUNT(DISTINCT teamID) igual al número total de equipos (limitado a 'football' ), lo que indica que el jugador juega para cada equipo.

 SELECT player.playerID player.playerName FROM player INNER JOIN plays ON player.playerID = plays.playerID INNER JOIN team ON plays.teamID = team.teamID WHERE team.sport = 'football' /* A player with a count of distinct teamID equal to the total possible teams indicates the player plays for all teams */ GROUP BY player.playerID, player.playerName HAVING COUNT(DISTINCT plays.teamID) = (SELECT COUNT(teamID) FROM team WHERE sport='football') 

De hecho, con este formulario, dado que el team JOIN against ya lo limita a los equipos de fútbol solamente, no debería necesitar realmente COUNT(DISTINCT plays.teamID) . Debería funcionar con COUNT(*) en la cláusula HAVING , a less que sea posible que un jugador aparezca en la list más de una vez para el mismo equipo.

  1. Obtenga las identificaciones de todos los equipos de fútbol:

     SELECT teamID FROM team WHERE sport = 'football' 
  2. Obtenga las identificaciones de todos los equipos para los que jugó un jugador específico:

     SELECT TeamID FROM plays WHERE playerID = @playerID 
  3. Excluya esto último de lo anterior

     SELECT teamID FROM team WHERE sport = 'football' EXCEPT SELECT TeamID FROM plays WHERE playerID = @playerID 
  4. Verifica si el resultado no tiene ninguna fila:

     NOT EXISTS ( SELECT teamID FROM team WHERE sport = 'football' EXCEPT SELECT TeamID FROM plays WHERE playerID = @playerID ) 
  5. Aplica la condición a cada jugador:

     SELECT playerID, playerName FROM player WHERE NOT EXISTS ( SELECT teamID FROM team WHERE sport = 'football' EXCEPT SELECT TeamID FROM plays WHERE playerID = player.playerID ) ;