2012-03-09 152 views
1

这就是我试图回答的问题...学习SQL ...有没有更好的方法来写这个?

所有团队中只有一个玩家出现在 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。

+0

什么味道的SQL? SQL Server,MySQL? – 2012-03-09 04:53:54

+0

这是一个家庭作业或什么,大声笑?如果是这样,不酷。 – 2012-03-09 04:55:40

+0

另外,你能解释一下GS是什么吗?我不确定我是否完全明白它的用途,以确保我正确地编写查询。 – 2012-03-09 05:01:32

回答

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

是的,这是一个正确的结果集。我让一对不该在那里的夫妇进来。谢谢。 – MCR 2012-03-13 21:16:08

0

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

基本上,内部SELECT会查找所有只有一名玩家参加的“出场”​​,由GS(游戏?)和teamId进行分组。我们应该只返回一次外观(如果有意义的话)。理论上,如果有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 

干杯。让我知道它是否工作或不。

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 
相关问题