【问题标题】:Learning SQL ... Is there a better way to write this?学习 SQL... 有没有更好的方法来写这个?
【发布时间】:2012-03-09 04:52:01
【问题描述】:

这就是我要回答的问题……

只有一名球员出现的所有球队的球队名称是什么 145 个或更多游戏?

这是我的解决方案。

SELECT name
  From Teams
 WHERE teamID IN (SELECT original.teamID
                    FROM Appearances original
                   WHERE teamID Not In (SELECT one.teamID
                                         FROM Appearances one, Appearances two
                                        Where (one.teamID = two.teamID) 
                                          AND (one.playerID <> two.playerID) 
                                          AND (one.GS > 144) AND (two.GS > 144)));

这可行,但我想知道是否有更清洁/更有效的方法来编写它。我使用 Derby 作为我的 dbms。

【问题讨论】:

  • 什么风格的 SQL? SQL Server、MySQL?
  • 这是家庭作业还是什么,哈哈?如果是这样,那就不酷了。
  • 另外,你能解释一下什么是GS吗?我不确定我是否理解它是否完全用于确保我正确编写查询。
  • 功课没问题...但请添加标签以便我们指导。
  • @MCR:原始查询肯定会返回不超过一名球员出现在超过 145 场比赛中的球队,而不仅仅是只有一名球员出现在超过 145 场比赛中的球队145 场比赛 - 即。它还会返回没有出现在超过 145 场比赛中的球员的球队吗?

标签: sql derby


【解决方案1】:

我不确定您的查询是否有效。我希望它更像这样:

SELECT name
  FROM Teams
 WHERE teamID IN 
       ( SELECT one.teamID
           FROM Appearances one
          WHERE (one.GS > 144)
                AND one.teamID NOT IN 
                ( SELECT two.teamID
                    FROM Appearances two
                   WHERE (one.teamID = two.teamID)
                         AND (one.playerID <> two.playerID) 
                         AND (two.GS > 144) ) );

【讨论】:

  • 是的,这是一个正确的结果集。我的让一对不应该在那里的夫妇进来。谢谢。
【解决方案2】:

我认为这就是你想要的。假设 GS 是游戏的某种唯一标识符。您正在寻找参加过等于或大于 145 场比赛的球队。 另外,我不确定是否有语法错误,我用记事本写了这个,我要睡觉了。

基本上,内部 SELECT 会找到只有 1 名玩家玩过的所有“外观”,按 GS(游戏?)和 teamId 分组。我们应该只返回 1 次出现(如果有意义的话)。理论上,如果有 200 场比赛,但 146 场比赛只有 1 次出场,则只会返回 146 场比赛。

然后外部 SELECT 对该结果进行连接,并找到计数大于或等于 145 的位置。如果您已经理解这一点,请道歉,但根据您的标题,听起来您是 SQL 新手。

SELECT
    t.name
FROM
    Teams t
JOIN
(
    SELECT
        a.teamId
    FROM
        Appearances a
    GROUP BY
        a.GS
        , a.teamId
    HAVING
        COUNT(a.GS) = 1
) p1 ON t.teamId = p1.teamId
GROUP BY
    t.name
HAVING
    COUNT(t.name) >= 145

干杯。让我知道它是否有效。

【讨论】:

    【解决方案3】:

    试试:

    select max(t.name) team_name
    from teams t
    join appearances a on t.team_id = a.team_id and a.GS > 144
    group by t.team_id
    having count(distinct a.playerID)=1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      相关资源
      最近更新 更多