如何使用第三个表中的字段将2个表连接到一个查询中?

时间:2014-03-19 14:31:11

标签: sql sql-server join

我正在努力解决最后几个小时的任务......

我有四张桌子:

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 / APPLY吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 ...

的用法很好