我有多个外连接
SELECT A.column2
, B.column2
, C.column2
FROM
(
(SELECT month, column2 FROM table1) A
FULL OUTER JOIN
(SELECT month, column2 FROM table2) B on A.month= B.month
FULL OUTER JOIN
(SELECT month, column2 FROM table3) C on A.month= C.month
)
现在最后一次加入是有问题的,当A的月份超过B时它会重复但是如果B有更多的月份A我们在C中有OUTER JOIN而A现在重复,所以我想有一个完整的两个表内的OUTER JOIN可以解决问题吗?任何深入的链接??
示例数据(不正确)
╔════════════╦═════════╦═════════════╗
║ Revenue ║ Budget ║ ActualMonth ║
╠════════════╬═════════╬═════════════╣
║ 6.9172 ║ 3.5046 ║ Jan ║
║ 7.3273 ║ 3.7383 ║ Feb ║
║ 7.3273 ║ 3.9719 ║ Mar ║
║ 7.2726 ║ 4.2056 ║ Apr ║
║ 7.2595 ║ 6.7757 ║ May ║
║ 7.2726 ║ 6.7757 ║ Jun ║
║ 0.41 ║ 0.00 ║ Jul ║
║ 0.41 ║ 0.00 ║ Aug ║
║ 0.41 ║ 0.00 ║ Sep ║
║ 0.41 ║ 0.00 ║ Oct ║
║ 7.4696 ║ 0.00 ║ Nov ║
║ 7.4696 ║ 0.00 ║ Dec ║
║ 0.00 ║ 9.3457 ║ Sep ║
║ 0.00 ║ 16.3551 ║ Dec ║
║ 0.00 ║ 6.3084 ║ Jul ║
║ 0.00 ║ 14.0186 ║ Oct ║
║ 0.00 ║ 16.3551 ║ Nov ║
║ 0.00 ║ 6.1915 ║ Aug ║
╚════════════╩═════════╩═════════════╝
正确的数据
╔════════════╦═════════╦═════════════╗
║ Revenue ║ Budget ║ ActualMonth ║
╠════════════╬═════════╬═════════════╣
║ 6.9172 ║ 3.5046 ║ Jan ║
║ 7.3273 ║ 3.7383 ║ Feb ║
║ 7.3273 ║ 3.9719 ║ Mar ║
║ 7.2726 ║ 4.2056 ║ Apr ║
║ 7.2595 ║ 6.7757 ║ May ║
║ 7.2726 ║ 6.7757 ║ Jun ║
║ 0.41 ║ 6.3084 ║ Jul ║
║ 0.41 ║ 6.1915 ║ Aug ║
║ 0.41 ║ 9.3457 ║ Sep ║
║ 0.41 ║ 14.0186 ║ Oct ║
║ 7.4696 ║ 16.3551 ║ Nov ║
║ 7.4696 ║ 16.3551 ║ Dec ║
╚════════════╩═════════╩═════════════╝
答案 0 :(得分:32)
SELECT A.column2
, B.column2
, C.column2
FROM
(
(SELECT month, column2 FROM table1) A
FULL OUTER JOIN
(SELECT month, column2 FROM table2) B on A.month= B.month
FULL OUTER JOIN
(SELECT month, column2 FROM table3) C on ISNULL(A.month, B.month) = C.month
)
答案 1 :(得分:6)
其中一种方法可以是从所有三个表中的所有可能数据创建“锚”表,然后使用left outer join
:
select
A.column2,
B.column2,
C.column2
from (
select distinct month from table1
union
select distinct month from table2
union
select distinct month from table3
) as X
left outer join table1 as A on A.month = X.month
left outer join table2 as B on B.month = X.month
left outer join table3 as C on C.month = X.month
答案 2 :(得分:3)
我可以想到两种方法可以解决这个问题,具体取决于定义所需结果的实际逻辑。
第一种也是最简单的方法是使用GROUP BY月,并使用MAX(column2)等聚合函数来获取非零行,或者如果有多个非零行,则需要添加,使用SUM()。如果存在满足逻辑意图的聚合函数,则这是最佳解决方案。
另一个是在你的JOIN中包含更多条件,例如" WHERE a.month = b.month AND b.column2> 0",但如果可以存在多个非零行,则仍然无法解决问题。
答案 3 :(得分:2)
使用COALESCE功能选项确定列分组。
SELECT COALESCE(t1.Month, t2.Month, t3.Month) AS Month,
SUM(ISNULL(t1.Col1, 0)) AS t1Col1,
SUM(ISNULL(t2.Col1, 0)) AS t2Col1,
SUM(ISNULL(t3.Col1, 0)) AS t3Col1
FROM dbo.table1 t1 FULL OUTER JOIN dbo.table2 t2 ON t1.Month = t2.Month
FULL OUTER JOIN dbo.table3 t3 ON t1.Month = t3.Month
GROUP BY COALESCE(t1.Month, t2.Month, t3.Month)
答案 4 :(得分:1)
类似
select month, sum(a) a, sum(b) b, sum(c) c from (
SELECT month, column2 A, 0 B, 0 C FROM table1
union
SELECT month, 0 A, column2 B, 0 C FROM table2
union
SELECT month, 0 A, 0 B, column2 C FROM table3
) x
group by month
答案 5 :(得分:0)
与其一次完成所有的外连接,不如像这样一次完成一个:
SELECT A.column2
, B.column2
, C.column2
FROM
(
(SELECT month, column2 FROM (
(SELECT month, column2 FROM table1) A
FULL OUTER JOIN
(SELECT month, column2 FROM table2) B on A.month= B.month
)) A_AND_B
FULL OUTER JOIN
(SELECT month, column2 FROM table3) C on A_AND_B.month= C.month
)
即,对 A 和 B 进行完全外连接,然后对 that 和 C 进行完全外连接,然后对 that 和 D 进行完全外连接,然后进行that 和 E 等的全外连接
这不像上面的其他答案那么复杂,并且可以对尽可能多的表重复进行完全外连接。