学习SQL ...有没有更好的方法来写这个?

时间:2012-03-09 04:52:01

标签: sql derby

这是我想回答的问题......

所有拥有一名且只有一名球员的球队的球队名称是什么? 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。

3 个答案:

答案 0 :(得分:0)

我认为这就是你想要的。假设GS是游戏的某种唯一标识符。而且你正在寻找玩过等于或超过145场比赛的球队。 另外,我不确定是否存在语法错误,我在记事本中写道,我即将上床睡觉。

基本上,内部SELECT会找到所有“外观”,其中只有1个玩家玩过,按照GS(游戏?)和teamId进行分组。我们应该只用一次外观取回所有外观(如果这是有道理的)。从理论上讲,如果有200场比赛,但146场只有1场比赛,那么只会有146场比赛结果。

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

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

干杯。如果有效或无效,请告诉我。

答案 1 :(得分:0)

尝试:

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

答案 2 :(得分:0)

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

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