2016-05-27 28 views
0

以下のようにcase文を実行して左外部結合を行うことは可能ですか?私は達成しようとしていることについてコメントしました。複数の左外部結合を持つSQLのCase文

SELECT 
    eventGame.Id, 
    eventGame.[Type] AS GameType 
FROM GrassrootsHoops.EventGame eventGame 
LEFT OUTER JOIN (SELECT 
    divisionGameTeamResult.Id, 
    divisionGameTeamResult.GameId, 
    COALESCE(divisionPool.Name, divisionTeamPoolPoolBracket.Name) AS DivisionPoolName 
FROM GrassrootsHoops.DivisionGameTeamResult divisionGameTeamResult 
LEFT OUTER JOIN 

-- CASE eventGame.[Type] = 1 THEN 

GrassrootsHoops.DivisionTeamPoolGame divisionTeamPoolGame 
    ON divisionTeamPoolGame.Id = divisionGameTeamResult.Id 
LEFT OUTER JOIN GrassrootsHoopS.DivisionTeamPool divisionTeamPool 
    ON divisionTeamPool.Id = divisionTeamPoolGame.DivisionTeamPoolId 
LEFT OUTER JOIN GrassrootsHoops.DivisionPool divisionPool 
    ON divisionPool.Id = divisionTeamPool.DivisionPoolId 
LEFT OUTER JOIN GrassrootsHoops.DivisionPoolSettings divisionPoolSettings 
    ON divisionPool.Id = divisionPoolSettings.Id 
LEFT OUTER JOIN GrassrootsHoops.DivisionTeam divisionTeam 
    ON divisionTeam.Id = divisionTeamPool.DivisionTeamId 
LEFT OUTER JOIN GrassrootsHoops.Team team 
    ON team.Id = divisionTeam.Id 
LEFT OUTER JOIN 

-- CASE eventGame.[Type] = 2 THEN 

GrassrootsHoops.DivisionBracketParticipant divisionBracketGameParticipant 
    ON divisionBracketGameParticipant.DivisionGameTeamResultId = divisionGameTeamResult.Id 
LEFT OUTER JOIN GrassrootsHoops.DivisionBracketParticipantPart divisionBracketParticipantPart 
    ON divisionBracketParticipantPart.Id = divisionBracketGameParticipant.DivisionBracketParticipantPartId 
LEFT OUTER JOIN GrassrootsHoops.DivisionBracketParticipantTeam divisionBracketGameParticipantTeam 
    ON divisionBracketGameParticipantTeam.Id = divisionBracketGameParticipant.Id 
LEFT OUTER JOIN GrassrootsHoops.DivisionTeam divisionTeamBracket 
    ON divisionTeamBracket.Id = divisionBracketGameParticipantTeam.DivisionTeamId 
LEFT OUTER JOIN GrassrootsHoops.Team teamBracket 
    ON teamBracket.Id = divisionTeamBracket.Id 
LEFT OUTER JOIN GrassrootsHoops.DivisionBracketParticipantBracket divisionBracketParticipantBracket 
    ON divisionBracketParticipantBracket.Id = divisionBracketGameParticipant.Id 
LEFT OUTER JOIN GrassrootsHoops.DivisionBracket divisionBracketParticipantBracketBracket 
    ON divisionBracketParticipantBracketBracket.Id = divisionBracketParticipantBracket.DivisionBracketId 
LEFT OUTER JOIN GrassrootsHoops.DivisionBracketParticipantPool divisionBracketGameParticipantPool 
    ON divisionBracketGameParticipantPool.Id = divisionBracketGameParticipant.Id 
LEFT OUTER JOIN GrassrootsHoops.DivisionPool divisionPoolBracket 
    ON divisionPoolBracket.Id = divisionBracketGameParticipantPool.DivisionPoolId 
LEFT OUTER JOIN GrassrootsHoops.DivisionBracketParticipantTeamPool divisionBracketGameParticipantTeamPool 
    ON divisionBracketGameParticipantTeamPool.Id = divisionBracketGameParticipant.Id 
LEFT OUTER JOIN GrassrootsHoops.DivisionTeamPool divisionTeamPoolBracket 
    ON divisionTeamPoolBracket.Id = divisionBracketGameParticipantTeamPool.DivisionTeamPoolId 
LEFT OUTER JOIN GrassrootsHoops.DivisionPool divisionTeamPoolPoolBracket 
    ON divisionTeamPoolPoolBracket.Id = divisionTeamPoolBracket.DivisionPoolId 
LEFT OUTER JOIN GrassrootsHoops.DivisionTeam divisionTeamPoolTeamBracket 
    ON divisionTeamPoolTeamBracket.Id = divisionTeamPoolBracket.DivisionTeamId 
LEFT OUTER JOIN GrassrootsHoops.Team teamPoolTeamBracket 
    ON teamPoolTeamBracket.Id = divisionTeamPoolTeamBracket.Id 
WHERE divisionGameTeamResult.HomeTeam = 1) homeTeam 
    ON homeTeam.GameId = eventGame.GameId 
+0

「ゲーム」というエイリアスはどのテーブルに属していますか? –

答えて

1

外部結合を使用してcase文を実行することはできません。私はUNIONを使っても、あなたが望むことができると思います。ここでは、ゲームのタイプに基づいて2つの別々の結合を実行する、より単純なスキーマを使用する例を示します。

SELECT 
    Game.Id, 
    PoolResult.Score 
    FROM 
    Game 
    JOIN PoolResult 
    ON PoolResult.GameId = Game.Id 
    WHERE 
    Game.GameType = 1 
UNION 
    SELECT 
    Game.Id, 
    BracketResult.Score 
    FROM 
    Game 
    JOIN BracketResult 
    ON BracketResult.GameId = Game.Id 
    WHERE 
    Game.GameType = 2 

Here's a working version at SQL Fiddle

お問い合わせについては、あなただけのゲームの種類ごとに2つの完全に独立したクエリ1を書きたいです。別々のクエリごとに作業したら、それらの間にUNIONを置くだけで結果が連結されます。 UNIONを使用するようにクエリが変更されました。私はエラーをチェックする簡単な方法がないので、多少のマイナーエラーがあるかもしれません。

SELECT 
    divisionGameTeamResult.Id, 
    eventGame.[Type] AS GameType 
    FROM 
    GrassrootsHoops.EventGame eventGame 
    JOIN GrassrootsHoops.DivisionGameTeamResult divisionGameTeamResult 
    ON (divisionGameTeamResult.GameId = eventGame.GameId 
    JOIN GrassrootsHoops.DivisionTeamPoolGame divisionTeamPoolGame 
    ON divisionTeamPoolGame.Id = divisionGameTeamResult.Id 
    JOIN GrassrootsHoopS.DivisionTeamPool divisionTeamPool 
    ON divisionTeamPool.Id = divisionTeamPoolGame.DivisionTeamPoolId 
    JOIN GrassrootsHoops.DivisionPool divisionPool 
    ON divisionPool.Id = divisionTeamPool.DivisionPoolId 
    JOIN GrassrootsHoops.DivisionPoolSettings divisionPoolSettings 
    ON divisionPool.Id = divisionPoolSettings.Id 
    JOIN GrassrootsHoops.DivisionTeam divisionTeam 
    ON divisionTeam.Id = divisionTeamPool.DivisionTeamId 
    JOIN GrassrootsHoops.Team team 
    ON team.Id = divisionTeam.Id 
    WHERE 
    divisionGameTeamResult.HomeTeam = 1 
    AND 
    eventGame.[Type] = 1 
UNION 
    SELECT 
    divisionGameTeamResult.Id, 
    eventGame.[Type] AS GameType 
    FROM 
    GrassrootsHoops.EventGame eventGame 
    JOIN GrassrootsHoops.DivisionGameTeamResult divisionGameTeamResult 
    ON (divisionGameTeamResult.GameId = eventGame.GameId) 
    JOIN GrassrootsHoops.DivisionBracketParticipant divisionBracketGameParticipant 
    ON divisionBracketGameParticipant.DivisionGameTeamResultId = divisionGameTeamResult.Id 
    JOIN GrassrootsHoops.DivisionBracketParticipantPart divisionBracketParticipantPart 
    ON divisionBracketParticipantPart.Id = divisionBracketGameParticipant.DivisionBracketParticipantPartId 
    JOIN GrassrootsHoops.DivisionBracketParticipantTeam divisionBracketGameParticipantTeam 
    ON divisionBracketGameParticipantTeam.Id = divisionBracketGameParticipant.Id 
    JOIN GrassrootsHoops.DivisionTeam divisionTeamBracket 
    ON divisionTeamBracket.Id = divisionBracketGameParticipantTeam.DivisionTeamId 
    JOIN GrassrootsHoops.Team teamBracket 
    ON teamBracket.Id = divisionTeamBracket.Id 
    JOIN GrassrootsHoops.DivisionBracketParticipantBracket divisionBracketParticipantBracket 
    ON divisionBracketParticipantBracket.Id = divisionBracketGameParticipant.Id 
    JOIN GrassrootsHoops.DivisionBracket divisionBracketParticipantBracketBracket 
    ON divisionBracketParticipantBracketBracket.Id = divisionBracketParticipantBracket.DivisionBracketId 
    JOIN GrassrootsHoops.DivisionBracketParticipantPool divisionBracketGameParticipantPool 
    ON divisionBracketGameParticipantPool.Id = divisionBracketGameParticipant.Id 
    JOIN GrassrootsHoops.DivisionPool divisionPoolBracket 
    ON divisionPoolBracket.Id = divisionBracketGameParticipantPool.DivisionPoolId 
    JOIN GrassrootsHoops.DivisionBracketParticipantTeamPool divisionBracketGameParticipantTeamPool 
    ON divisionBracketGameParticipantTeamPool.Id = divisionBracketGameParticipant.Id 
    JOIN GrassrootsHoops.DivisionTeamPool divisionTeamPoolBracket 
    ON divisionTeamPoolBracket.Id = divisionBracketGameParticipantTeamPool.DivisionTeamPoolId 
    JOIN GrassrootsHoops.DivisionPool divisionTeamPoolPoolBracket 
    ON divisionTeamPoolPoolBracket.Id = divisionTeamPoolBracket.DivisionPoolId 
    JOIN GrassrootsHoops.DivisionTeam divisionTeamPoolTeamBracket 
    ON divisionTeamPoolTeamBracket.Id = divisionTeamPoolBracket.DivisionTeamId 
    JOIN GrassrootsHoops.Team teamPoolTeamBracket 
    ON teamPoolTeamBracket.Id = divisionTeamPoolTeamBracket.Id 
    WHERE 
    divisionGameTeamResult.HomeTeam = 1 
    AND 
    eventGame.[Type] = 1 
+0

このアプローチでは、Type = 2の場合、Unionの2番目の選択は行われません。およびその逆。私はちょうど起こっている関節を減らそうとしています。 –

+0

UNIONでは、両方のSQLクエリを別々に実行してから連結するのと同じように機能します。私の例では、最初の選択クエリには、Type = 1に制限されるWHEREと、Type = 2に制限される2つ目の選択クエリがあります。つまり、Type = 1のゲームの場合のみ、 2番目のゲームはType = 2のゲームの行のみを返します。 –

+0

eventGameが内部クエリの外にあり、バインドできなかったため、機能しません。 –

関連する問題