2012-03-09 2 views
1

これは私が答えようとしている問題です...SQLの学習...これを書くには良い方法はありますか?

145人以上のゲームに表示されるプレイヤーが1人しかいないチームのチーム名は何ですか?

私の解決策です。

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

これはうまくいきますが、これを書くにはクリーナー/効率的な方法があるのでしょうか?私はdbmsとしてDerbyを使用しています。

+0

どのようなSQLの味ですか? SQL Server、MySQL? –

+0

これは宿題か何か、笑ですか?もしそうなら、冷たくない。 –

+0

また、GSが何であるか説明できますか?私はそれが正確に私が正しくクエリを書いていることを確認するために使用していることを理解しているか分からない。 –

答えて

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

0

私はこれがあなたの望みだと思っています。 GSがゲームの一意の識別子であると仮定します。そして、145試合以上の試合で出場したチームを探しています。 また、文法上の間違いがあるかどうかは分かりませんが、私はメモ帳でこれを書いています。

基本的には内側のSELECTは、GS(ゲーム?)とteamIdによってグループ分け、1つだけのプレーヤーが再生されるすべての「アピアランス」を検索します。すべての外観を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 

乾杯。それが動作するかどうか私に教えてください。

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 
関連する問題