programing

여러 테이블에 여러 개의 FULL OUTER JOIN(전체 외부 조인

lastmoon 2023. 7. 31. 21:50
반응형

여러 테이블에 여러 개의 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
)

이제 마지막 조인에 문제가 있습니다. A의 달이 B보다 많을 때 반복되지만 B의 달이 C의 A의 달과 함께 C의 OUTER JOIN이 더 많으면 두 테이블 내에서 전체 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         ║
╚════════════╩═════════╩═════════════╝
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
)

이를 위한 방법 중 하나는 세 개의 테이블 모두에서 가능한 모든 데이터로부터 "앵커" 테이블을 만든 다음 사용할 수 있습니다.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

그룹화를 결정하려면 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)

원하는 결과를 정의하는 실제 논리에 따라 이 문제를 해결할 수 있는 두 가지 방법을 생각해 볼 수 있습니다.

첫 번째이자 가장 확실한 방법은 GROUP BY 월을 사용하고 MAX(열 2)와 같은 집계 함수를 사용하여 0이 아닌 행만 가져오거나 0이 아닌 행이 여러 개 있는 경우 SUM()을 사용하는 것입니다.논리적 의도를 충족하는 집계 함수가 있는 경우 이 솔루션이 가장 좋습니다.

또 다른 방법은 "WHERE a.month=b.month and b.column2 > 0"과 같이 조인에 더 많은 조건을 포함하는 것이지만, 0이 아닌 행이 둘 이상 있을 수 있는 경우에도 문제가 해결되지 않습니다.

비슷한 것

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

외부 조인을 한 번에 모두 수행하는 대신 다음과 같이 한 번에 하나씩 수행하는 것이 어떻습니까?

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에 대해 완전한 외부 결합을 수행한 다음, C에 대해 완전한 외부 결합을 수행하고, D에 대해 완전한 외부 결합을 수행한 다음, E에 대해 완전한 외부 결합을 수행합니다.

이것은 위의 다른 답변보다 덜 복잡하며 전체 외부 조인을 원하는 만큼의 테이블에 대해 반복할 수 있습니다.

언급URL : https://stackoverflow.com/questions/16167902/multiple-full-outer-join-on-multiple-tables

반응형