2014-03-19 49 views
0

我試圖解決任務的最後幾個小時...如何使用第三個表中的字段將2個表加入到一個查詢中?

我有四個表:

Users (ID INT, Fullname VARCHAR(255)) 

Segments (Value VARCHAR(255)) 

Report_1 (ID INT, UserID INT, Segment VARCHAR(255), Total INT) 

Report_2 (ID INT, UserID INT, Segment VARCHAR(255), Total INT) 

...我需要得到所有用戶的所有可能的細分報告。

但是來自「Report_1」,「Report_2」的報告可能沒有某些用戶或分段的記錄。

結果查詢必須具有此列:

UserID, Segment, Report_1.Total(OR NULL), Report_2.Total(OR NULL) 

我可以用CROSS JOIN /應用還是什麼?

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

+0

現在我知道了......並絕對同意!謝謝! – kidig

回答

3

一個簡單的笛卡兒連接與外連接應該做的伎倆:

SELECT Users.ID AS [UserID], Segments.Value AS [Segment], Report_1.Total, Report_2.Total 
FROM Users, Segments 
LEFT OUTER JOIN Report_1 ON 
    Report_1.UserID = Users.ID AND Report_1.Segment = Segments.Value 
LEFT OUTER JOIN Report_2 ON 
    Report_2.UserID = Users.ID AND Report_2.Segment = Segments.Value 
+0

它的工作原理!看起來很漂亮!非常感謝,丹! – kidig

+0

我在** SQL Server 2012 **上遇到了關於實際查詢的錯誤。 所以我不得不使用:** FROM Users CROSS JOIN段** 而不是逗號... – kidig

0

最好的,我可以建議是:

SELECT 
    U.UserID, 
    S.Value, 
    ISNULL(R1.Total, 0), 
    ISNULL(R2.Total, 0) 
FROM 
    Users U 
CROSS APPLY (
    SELECT DISTINCT Value FROM Segment 
) S 
LEFT JOIN (
    SELECT 
     SUM(Total) AS Total, 
     Segment, 
     UserID 
    FROM 
     Report_1 
    GROUP BY 
     Segment, 
     UserID 
) R1 ON 
    R1.UserID = U.UserID AND 
    R1.Segment = S.Value 
LEFT JOIN (
     SELECT 
     SUM(Total) AS Total, 
     Segment, 
     UserID 
    FROM 
     Report_2 
    GROUP BY 
     Segment, 
     UserID 
) R2 ON 
    R2.UserID = U.UserID AND 
    R2.Segment = S.Value 

我希望這是一個好使用率CROSS APPLY。 ..

相關問題