2012-03-09 95 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 
相關問題