【问题标题】:SQL Case statement with multi left outer joins具有多左外连接的 SQL Case 语句
【发布时间】:2016-05-27 04:18:20
【问题描述】:

是否可以像我在下面做的那样做 case 语句和左外连接?我把 cmets 放在我想要实现的目标上。

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

【问题讨论】:

  • 别名'game'属于哪个表?

标签: sql join case


【解决方案1】:

你不能用外连接做 case 语句。我认为你可以做你想做的事,尽管使用 UNION。这是一个使用更简单架构的示例,我们根据游戏类型进行两个单独的连接。

  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)

对于您的查询,您只想为每种类型的游戏编写两个完全独立的查询。一旦你为每个单独的查询工作,只需在它们之间插入一个 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

【讨论】:

  • 我假设在这种方法中,如果 Type = 2,Union 中的第二个选择永远不会发生?反之亦然。我只是想减少正在进行的关节。
  • 使用 UNION 有点像分别运行两个 SQL 查询然后将它们连接起来。在我的示例中,第一个选择查询有一个 WHERE 将其限制为 Type = 1,第二个选择查询有一个 where 将其限制为 Type = 2。这意味着第一个查询只会返回 Type = 1 的游戏行第二个只会返回 Type = 2 的游戏行。
  • 无法工作,因为 eventGame 在内部查询之外并且无法绑定。
  • 我编辑了我的答案,以包含一个更简单的示例来更好地解释我的意思。我还尝试使用 UNION 重做您的原始查询,以便您可以尝试运行它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
  • 1970-01-01
  • 1970-01-01
  • 2016-07-31
  • 1970-01-01
  • 2013-03-23
相关资源
最近更新 更多