SQL选择子查询和联接

时间:2016-03-13 19:39:03

标签: sql sql-server subquery

我一直试图解决一个问题,实际上是15个小时以上,我得出的结论是,我已经深入了解,但我希望能够理解它是如何完成的。

我面临的问题是第一个问题,我的大多数问题都源于主队和客队得分和名字。

这是我对查询的了解程度。

SELECT home.TeamName AS HomeTeamName, home.Score AS HomeScore
FROM MatchParticipant home
LEFT JOIN Match m ON home.MatchID = m.MatchID
WHERE Field = 'Home' AND m.MatchStatus = 'NotStarted'
),
AwayTable AS(
SELECT away.TeamName AS AwayTeamName, away.Score AS AwayScore
FROM MatchParticipant away
RIGHT JOIN Match m ON away.MatchID = m.MatchID
WHERE Field = 'Away' AND m.MatchStatus = 'NotStarted'
)
SELECT HomeTeamName,HomeScore, AwayTeamName, AwayScore, StartDate, b.MatchID, MatchStatus, t.TournamentName,a.MatchParticipantID
FROM HomeTable, AwayTable, MatchParticipant a
INNER JOIN Match b ON b.MatchID=a.MatchID INNER JOIN Tournament t ON t.TournamentID=b.TournamentID
WHERE b.TournamentID = 2 AND b.MatchStatus = 'NotStarted'

我再次知道这是不正确的,但希望有人能告诉我出错的地方

1 个答案:

答案 0 :(得分:1)

问题A:获取尚未开始的所有英超联赛。

我会解释我的想法,希望有人会把我拉到我可能缺乏逻辑的地方。

SELECT T.TournamentName
FROM Tournament T
WHERE TournamentId = 2

返回'英超联赛'

接下来我们找到尚未开始的匹配。

SELECT M.StartDate, M.MatchId T.TournamentId, M.MatchStatus
FROM Tournament T
LEFT JOIN Match M ON T.TournamentID = M.TournamentId
WHERE T.TournamentId = 2 AND M.MatchStatus = 'Not Started'

从这里我们加入表格,为我们提供额外的细节

SELECT H.TeamName As [HomeTeamName], H.Score As [HomeTeamScore], A.TeamName As [AwayTeamName], A.TeamScore As [AwayTeamScore], M.StartDate, M.MatchId T.TournamentId, M.MatchStatus
FROM Tournament T
LEFT JOIN Match M ON T.TournamentID = M.TournamentId
LEFT OUTER JOIN MatchParticipant H ON M.MatchId = H.MatchId
LEFT OUTER JOIN MatchParticipant A ON M.MatchId = A.MatchId
WHERE T.TournamentId = 2 AND M.MatchStatus = 'Not Started' AND H.Field = 'Home' AND A.Field = 'Away'

所以第一个连接是一个左连接,因为如果第二个表中存在匹配,它只包含第一个表的结果。然后下一个连接是左外连接,因为它将返回第一个表的结果,即使MatchParticipant表中还没有任何数据。

从这里开始,您需要考虑匹配分数的默认值。如果它为'0'则很好,但是如果结果丢失,你应该考虑调查一个CASE语句,该语句位于SELECT语句中,你基本上会说'如果得分为NULL然后输出0,否则发出当前得分'

我希望这有所帮助。