多个表上的多个FULL OUTER JOIN

bry*_*val 29 sql t-sql sql-server sql-server-2005 full-outer-join

我有多个外连接

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
)
Run Code Online (Sandbox Code Playgroud)

现在最后一次加入有一个问题,它在A的月份超过B时重复,但是如果B有更多的月份A我们在C中有OUTER JOIN,而A现在重复,所以我想有一个完整的外部加入两个表可能会解决问题?任何深入的链接?

示例数据(不正确)

??????????????????????????????????????
?  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         ?
??????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

正确的数据

??????????????????????????????????????
?  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         ?
??????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

Ser*_*rge 37

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
)
Run Code Online (Sandbox Code Playgroud)

  • 根据环境,ISNULL() 是否等同于coalesce 或oracle 的NVL()?加入 NVL(A.ID, B.ID) = C.ID 是否以同样的方式操作 (4认同)
  • 我认为补充一点会很有用,如果你有 3 个以上的表你想要做一个完整的外连接,你要么必须开始嵌套 `ISNULL`,或者你可以只使用 `COALESCE` 代替,它应该可以工作所有符合标准的数据库。 (3认同)
  • 这应该可以解决您与 C 的问题。如果需要,请随意使用与 B 相同的逻辑 (ISNULL)。 (2认同)
  • 我最初在我的 join 子句中有一个 or ,但这为我节省了几个数量级的性能。 (2认同)

Rom*_*kar 9

其中一种方法是从所有三个表中的所有可能数据创建"锚"表,然后使用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
Run Code Online (Sandbox Code Playgroud)


Tab*_*man 5

我可以立即想到两种方法来解决这个问题,具体取决于定义所需结果的实际逻辑。

第一种也是最简单的方法是使用 GROUP BY 月份,并使用 MAX(column2) 等聚合函数仅获取非零行,或者如果要添加多个非零行,请使用和()。如果存在满足您的逻辑意图的聚合函数,则这是最佳解决方案。

另一种方法是在您的 JOIN 中包含更多条件,例如“WHERE a.month=b.month AND b.column2 > 0”,但如果可以有多个非零行,这仍然无法解决问题。


Ale*_*nko 5

使用选项和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)
Run Code Online (Sandbox Code Playgroud)