2010-04-02 64 views
0

我在加入表格的过程中获得了一些很大的帮助,并试图将其提升到一个新的水平。下面的SQL来自帮助,但是我添加了以COUNT开头的选择行,到收件人表的内部联接和Group By。SQL外部加入一堆内部加入的结果

SELECT 
    Event.EventID    AS EventID, 
    Event.EventDate   AS EventDateUTC, 
    Participant2.ParticipantID AS AwayID, 
    Participant1.ParticipantID AS HostID, 
    COUNT(Recipient.ChallengeID) AS AllChallenges 
FROM Event 
    INNER JOIN Matchup Matchup1 
    ON (Event.EventID = Matchup1.EventID) 
    INNER JOIN Matchup Matchup2 
    ON (Event.EventID = Matchup2.EventID) 
    INNER JOIN Participant Participant1 
    ON (Matchup1.Host = 1 
     AND Matchup1.ParticipantID = Participant1.ParticipantID) 
    INNER JOIN Participant Participant2 
    ON (Matchup2.Host != 1 
     AND Matchup2.ParticipantID = Participant2.ParticipantID) 
    INNER JOIN Recipient 
    ON (Event.EventID = Recipient.EventID) 
WHERE Event.CategoryID = 1 
    AND Event.Resolved = 0 
    AND Event.Type = 1 
GROUP BY Recipient.ChallengeID 
ORDER BY EventDateUTC ASC 

我的目标是获取收件人表中有多少行与事件中的EventID匹配的计数。此代码正常工作,除了,我也想得到结果,其中在Recipient中有0匹配的行。我想要15行(=事件的数量),但我得到2行,一个计数为1,一个计数为2(这适合于内部联接,因为示例收件人表中有3行,一个一个EventID和两个EventID)。

我认为无论是一个LEFT连接或一个OUTER连接是我正在寻找,但我知道我不太了解表如何实际加入。左边的加入让我多了一个0,这恰好是EventID 1(表中的第一件事),但仅此而已。错误建议我不能将INNER连接更改为OUTER。我尝试了一些加括号和一些子选项等,但似乎无法使其工作。

回答

1

用途:

SELECT e.eventid, 
      e.eventdate AS EventDateUTC, 
      p2.participantid AS AwayID, 
      p1.participantid AS HostID, 
      COUNT(r.challengeid) AS AllChallenges 
    FROM EVENT e 
    JOIN Matchup m1 ON m1.eventid = e.eventid 
        AND m1.host = 1 
    JOIN Matchup m2 ON m2.eventid = e.eventid 
        AND m2.host != 1 
    JOIN Participant p1 ON p1.participantid = m1.participantid 
    JOIN Participant p2 ON p2.participantid = m2.participantid 
LEFT JOIN RECIPIENT r ON r.eventid = e.eventid 
    WHERE e.categoryid = 1 
     AND e.resolved = 0 
     AND e.type = 1 
GROUP BY e.eventid, e.eventdate, p2.participantid, p1.participantid 
ORDER BY e.eventdate 
+0

啊!因此,通过对其他字段进行分组,在无法匹配行的情况下,对吗?太好了,谢谢! – 2010-04-02 23:22:54