Sql server 具有复合键的T-SQL多重外部联接
我有两个源代码视图:Sql server 具有复合键的T-SQL多重外部联接,sql-server,tsql,join,outer-join,Sql Server,Tsql,Join,Outer Join,我有两个源代码视图: View1 ----------------------------------------------------- | UserId | RoleId | Total1 (calculated value) | ----------------------------------------------------- | 1 | 21 | 9 | ----------------
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 |
-----------------------------------------------------
首选输出基于UserId和RoleId相等:
---------------------------------------------
| UserId | RoleId | Total1 | Total2 |
---------------------------------------------
| 1 | 21 | 9 | 2 |
---------------------------------------------
| 1 | 22 | 5 | NULL |
---------------------------------------------
| 1 | 24 | NULL | 1 |
---------------------------------------------
| 2 | 21 | 7 | NULL |
---------------------------------------------
| 3 | 21 | NULL | 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
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
或者,您可以使用
联合
和求和
来计算结果,如果每个表的行都不是唯一的,并且联接将产生重复,则这一点尤其有用:
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
假设每个表中只有一个匹配行,您将使用
完全外部联接
:
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
或者,您可以使用
联合
和求和
来计算结果,如果每个表的行都不是唯一的,并且联接将产生重复,则这一点尤其有用:
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
+1用于完全外部连接;我看到的大多数解决方案都是基于联合的,我的处境很奇怪:两种解决方案都能完美地工作。我先试了EricZ的,所以他会明白的,但也谢谢你,真的。当然,对于完全的外部连接+1.+1;我看到的大多数解决方案都是基于联合的,我的处境很奇怪:两种解决方案都能完美地工作。我先试了EricZ的,所以他会明白的,但也谢谢你,真的。当然还有+1。