【发布时间】:2010-12-18 09:15:56
【问题描述】:
我有一个失败的简单多对多模式,如下所示:alt text http://img406.imageshack.us/img406/8207/partialschema.png
我想要做的是选择所有具有一些任意条件的球员,如果他们参加过一场比赛,我也想选择他们最近的比赛。
我设法做的是:
SELECT tblPlayer.PlayerId, tblPlayer.Surname, tblPlayer.Forename,
(SELECT TOP 1 tblMatch.HomeClub + ' v ' + tblMatch.OpponentClub + ' ' + tblMatch.AgeGroup + ' (' + CONVERT(VARCHAR, tblMatch.MatchDateTime, 103) + ')'
FROM tblAppearance
INNER JOIN tblMatch ON tblAppearance.MatchID = tblMatch.MatchID
WHERE tblAppearance.PlayerID = tblPlayer.PlayerID
ORDER BY MatchDateTime DESC) AS Match
FROM tblPlayer
LEFT JOIN tblAppearance ON tblAppearance.PlayerId = tblPlayer.PlayerId
LEFT JOIN tblMatch ON tblMatch.MatchId = tblAppearance.MatchId
WHERE tblPlayer.Forename LIKE '%rob%' AND tblPlayer.Surname LIKE '%white%'
ORDER BY tblPlayer.Surname, tblPlayer.Forename, tblPlayer.DOB, tblMatch.MatchDateTime DESC
问题在于,这会选择玩家参加过的所有比赛,而不仅仅是他们最近的一场比赛。我知道这应该很简单,但我似乎无法获得正确的语法。
另外,我宁愿将匹配表中的单独列作为单独的列返回,而不是作为格式化的块返回。
对更多信息请求的答复:
是的,有一个 MatchDateTime 列,我打算将其用于排序。
是的,我确实想要尚未参加任何比赛的球员,左加入是故意的。
【问题讨论】:
-
没有 MatchDate 字段吗?这将使它变得非常容易......
-
另外,我是否正确假设查询中的 LEFT JOIN 意味着您希望为尚未参加任何比赛的玩家返回行?您可能应该将此信息添加到您的问题中。
-
tblAppearance.AppearanceId 是否与 tblMatch.MatchDateTime 的顺序相同?或者是否存在 ID 和日期顺序不同的情况(例如提前安排的比赛、提前结束的比赛等)?请将此信息添加到您的问题中。谢谢!
标签: sql sql-server-2005 join group-by