2011-11-11 11 views
3

私は相対的なSQL通知で、勉強したいと思っていますが、クエリをまとめるための助けが必要です。誰かが私を正しい方向に向けることができれば、私は感謝しています。このSQLクエリはどのようにして記述しますか?

テーブルはTeamRankingsです。列は次のとおりです。

score | qualities_id | team_id | year | source 

チームは、特定の年の異なる品質に関して採点されます。所与のチームに複数のスコアを割り当てることができることに留意されたい(それぞれが異なるソースからのものである)。同様に、所与のチームは与えられた年の間に全くスコアを持たないかもしれない。ここで

が問題だ:単一の品質、及びチームのリストを考えると

、私はそれらのチームのそれぞれは少なくとも一つのスコアを持っている年のリストを見つけたいです。

これはRails(3.1)から来ていますが、これはActive Recordと複数のdbコールを使ってやっかいなことです。しかし、私は純粋なSQLでできるようにしたいと思います。アクティブなレコードのボーナスは1 dbコールに制限されます。

ありがとうございました

答えて

1

ここには、6つのチームがある場合の例があります。 HAVING節(私の例では6)でテストする値は、IN節に含まれるteam_idの数と一致する必要があります。

SELECT year 
    FROM TeamRankings 
    WHERE qualities_id = 1 
     AND team_id IN (4,8,15,16,23,42) 
    GROUP BY year 
    HAVING COUNT(DISTINCT team_id) = 6; 
+0

BAM!どうもありがとう! – doublea

1

Ruby経由でパラメータを渡す方法はわかりませんが、ここではいくつかのSQLがあります。チーム名を取得するには、チームテーブルに参加することもできます。自分のスキーマに含まれていますが、唯一のSQLを使用して...

Select Distinct tr.Team_id, t.TeamName, tr.Year 
From TeamRankings tr 
    Inner Join Teams t 
Where Exists (
    Select 1 From TeamRankings 
    Where Team_id=tr.TeamID and Year=tr.Year and [email protected] 
) 
1

ない、あなたはデータがヤールなり、その後、すべてのチームが存在していることを確認するためにHAVING句を使用するグループに必要...

SELECT 
    year 
FROM 
    TeamRankings 
WHERE 
    team_id IN (<your_list>) 
    AND qualities_id = <your quality id> 
GROUP BY 
    year 
HAVING 
    COUNT(DISTINCT team_id) = <your number of teams> 

興味深いのは、リストをSQLクエリに渡す方法です。私の普通の習慣はid 'のコンマで区切られた文字列を渡し、SQL関数を使ってその文字列をレコードセットに分割することです。それは確かにエレガントな感じではありませんが、私はより多くの、ummm、斬新なソリューションに遭遇しました...

SELECT 
    year 
FROM 
    TeamRankings 
INNER JOIN 
    dbo.my_split_function(@list_of_ids) AS Team 
    ON Team.id = TeamRankings.team_id 
WHERE 
    qualities_id = @quality_id 
GROUP BY 
    year 
HAVING 
    COUNT(DISTINCT team_id) = (SELECT COUNT(DISTINCT id) FROM dbo.my_split_function(@list_of_ids)) 
関連する問題