这是我想回答的问题......
所有拥有一名且只有一名球员的球队的球队名称是什么? 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 :(得分: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) ) );