2013-07-17 74 views
0

加入我有两个来源观点:T-SQL多外复合键

View1 

----------------------------------------------------- 
| UserId | RoleId | Total1 (calculated value) | 
----------------------------------------------------- 
| 1  | 21 |   9    | 
----------------------------------------------------- 
| 1  | 22 |   5    | 
----------------------------------------------------- 
| 2  | 21 |   7    | 
----------------------------------------------------- 
| 4  | 23 |   4    | 
----------------------------------------------------- 

View2 

----------------------------------------------------- 
| UserId | RoleId | Total2 (calculated value) | 
----------------------------------------------------- 
| 1  | 21 |   2    | 
----------------------------------------------------- 
| 1  | 24 |   1    | 
----------------------------------------------------- 
| 3  | 21 |   3    | 
----------------------------------------------------- 
| 4  | 21 |   4    | 
----------------------------------------------------- 

的首选输出基于用户标识和角色ID平等:

--------------------------------------------- 
| UserId | RoleId | Total1 | Total2 | 
--------------------------------------------- 
| 1  | 21 |  9 | 2  | 
--------------------------------------------- 
| 1  | 22 |  5 | NULL | 
--------------------------------------------- 
| 1  | 24 | NULL | 1  | 
--------------------------------------------- 
| 2  | 21 |  7 | NULL | 
--------------------------------------------- 
| 3  | 21 | NULL | 3  | 
--------------------------------------------- 
| ... | ... | ... | ... | 

据我知道我应该使用某种类型的外部连接 - 但是如何?

回答

3
SELECT 
    ISNULL(v1.UserID,v2.UserID) as UserID, 
    ISNULL(v1.RoleID,v2.RoleID) as RoleID, 
    v1.Total1 , 
    v2.Total2 
FROM view1 v1 
FULL OUTER JOIN view2 v2 
ON v1.UserID = v2.UserID 
AND v1.RoleID = v2.RoleID 
2

假设仅存在一个从每个表匹配行,你可以使用一个FULL OUTER JOIN

SELECT COALESCE(v1.UserId, v2.UserId) AS UserId, 
    COALESCE(v1.RoleId, v2.RoleId) AS RoleId, 
    v1.Total1 
    v2.Total2 
FROM View1 v1 
FULL OUTER JOIN View2 v2 ON v1.UserId = v2.UserId AND v1.RoleId = v2.RoleId 

备选地,可以使用一个UNIONSUM结果,如果是特别有用行对于每个表格都是非唯一的,并且连接会产生重复:

SELECT UserId, RoleId, SUM(Total1) AS Total1, SUM(Total2) AS Total2 
FROM 
(
    SELECT UserId, RoleId, Total1, NULL AS Total2 
    FROM View1 
    UNION ALL 
    SELECT UserId, RoleId, NULL AS Total1, Total2 
    FROM View2 
) Combined 
GROUP BY UserId, RoleId 
+0

为完整的外连接+1;我看到的大多数解决方案都是基于工会的 – OzrenTkalcecKrznaric

+0

我处于一种奇怪的情况:两种解决方案都完美无缺。我尝试了埃里克的第一个,所以他会明白,但真的,也要感谢你。当然还有+1。 – boj