2010-04-02 65 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