【问题标题】:Trying to convert an NOT EXIST into COUNT试图将 NOT EXIST 转换为 COUNT
【发布时间】:2013-07-31 08:23:30
【问题描述】:

所以我知道如何使用NOT EXIST 进行查询。 但我似乎无法找到使用 COUNT 的等效项。

结构:

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

我提出的NOT EXIST 查询有效:

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));

查询查找为所有足球队效力的球员。 我正在尝试使用 count 来做同样的事情。要开始它,我知道我必须计算足球出现在运动下的次数,然后该球员必须为所有的 TeamID 比赛,其中这项运动是足球。在那之后我很困惑。有什么提示吗?

【问题讨论】:

  • 你的意思是你想改变不存在计算?你要数什么?
  • @FilipeSilva 我希望能够找到为所有足球队效力的所有球员。我使用 NOT EXIST 找到了查询。我想使用 COUNT 来查找它,并且仍然得到相同的结果。
  • 您使用的是哪个 DBMS?后格雷斯?甲骨文?

标签: sql select count


【解决方案1】:

您正在寻找的似乎是一个查询,检索所有球员HAVING COUNT(DISTINCT teamID) 等于球队总数(限于'football'),表明球员为每支球队效力。

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')

事实上,使用这种形式,由于JOINteam 已经将其仅限于足球队,因此您实际上不需要COUNT(DISTINCT plays.teamID)。它应该与 HAVING 子句中的 COUNT(*) 一起使用,除非有可能在同一支球队中多次列出玩家

【讨论】:

  • 这正是我想要的,但不是每支球队,我只想要每支 SPORT = 'football' 的球队
  • @user2632133 我想我现在有了 - 它在外部查询中没有得到适当的限制。这应该返回为所有足球队效力的每个人,而不是个足球队。换句话说,如果有人为所有足球和两支棒球队效力,他就会出现在这个结果中。
  • 非常感谢。它肯定有效。即使在网上阅读后,我也不理解 Join On 的概念。知道自然连接和外连接等。有什么方法可以在不使用“join on”的情况下做到这一点。
  • 您可以使用隐式连接,这意味着 FROM 子句中的逗号分隔表就像您原来的那样。这是一种旧语法,不鼓励这样做。显式 INNER JOIN 是等效的,但更现代的首选语法。另见codinghorror.com/blog/2007/10/…
  • 非常感谢。现在这是有道理的。我没有足够的代表来提高 :( 但非常感谢您的帮助。
【解决方案2】:
  1. 获取所有足球队的 ID:

    SELECT teamID
    FROM team
    WHERE sport = 'football'
    
  2. 获取特定玩家效力过的所有球队的 ID:

    SELECT TeamID
    FROM plays
    WHERE playerID = @playerID
    
  3. 从前者中排除后者

    SELECT teamID
    FROM team
    WHERE sport = 'football'
    
    EXCEPT
    
    SELECT TeamID
    FROM plays
    WHERE playerID = @playerID
    
  4. 检查结果是否没有任何行:

    NOT EXISTS (
        SELECT teamID
        FROM team
        WHERE sport = 'football'
    
        EXCEPT
    
        SELECT TeamID
        FROM plays
        WHERE playerID = @playerID
    )
    
  5. 将条件应用于每个玩家:

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

【讨论】:

    猜你喜欢
    • 2013-10-11
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    相关资源
    最近更新 更多