2013-04-23 15 views
12

mam wiele sprzężenia zewnętrzneMultiple FULL OUTER JOIN na wielu stołach

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 
) 

Teraz ostatni dołączyć ma problem, jego powtórzenie, gdy miesiąc A jest więcej niż B, ale jeśli B ma więcej miesiąc że A my mieć OUTER JOIN w C z miesiącem A, który teraz się powtarza, więc myślę, że posiadanie PEŁNEGO ZEWNĘTRZNEGO DOŁĄCZENIA w ramach dwóch tabel może rozwiązać problem? Jakieś niezależne linki ??

Przykładowe dane (Nieprawidłowy)

╔════════════╦═════════╦═════════════╗ 
║ 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   ║ 
╚════════════╩═════════╩═════════════╝ 

prawidłowe dane

╔════════════╦═════════╦═════════════╗ 
║ 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   ║ 
╚════════════╩═════════╩═════════════╝ 
+3

proszę dodać przykładowe dane i spodziewanych rezultatów . – TechDo

+3

Zewnętrzne łączenia są przemienne. 'Zewnętrzne sprzężenie B zewnętrzne sprzężenie C' jest takie samo jak" Zewnętrzne połączenie C zewnętrzne sprzężenie B ". W rzeczywistości jest to nawet to samo, co "Zewnętrzne sprzężenie (B zewnętrzne sprzężenie C)" Nie rozumiem twojego problemu * (uwaga: dotyczy to, ponieważ B i C łączą się z A) * – RichardTheKiwi

+0

Proszę sprawdzić przykładowe dane – brykneval

Odpowiedz

17
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 
) 
+0

to powinno naprawić swój problem z C. W razie potrzeby możesz użyć tej samej logiki (ISNULL) z B. – Serge

+0

dziękuję za pomoc :-) – brykneval

+1

w zależności od środowiska, czy ISNULL() jest odpowiednikiem koalescencji czy NVL (oracle's)? Czy dołączanie na NVL (A.ID, B.ID) = C.Identyfikator działa w ten sam sposób. –

3

mogę myśleć 2 sposoby off the bat, które można zająć się tym, w zależności od aktualnej logiki jest zdefiniowanie pożądanych rezultatów.

Pierwszym i najbardziej niezawodnym sposobem jest użycie GROUP BY month i użycie funkcji agregujących, takich jak MAX (kolumna 2), aby uzyskać tylko niezerowe wiersze lub jeśli istnieje wiele niezerowych wierszy, które chcesz aby dodać, użyj SUMA(). Jest to najlepsze rozwiązanie, jeśli istnieje funkcja agregująca, która spełnia twoje logiczne intencje.

Kolejnym elementem jest dołączenie większej ilości warunków do JOIN, np. "GDZIE a.miesiąc = b.miesi ORAZ b.kolumny2> 0", ale to nadal nie rozwiąże problemu, jeśli może być więcej niż jeden zero wierszy.

+0

Zgadzam się z Tab, użyj GROUP BY i SUM() lub MAX() –

1

coś

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 
1

Użyj opcji z COALESCE funkcji do określenia grupowanie kolumn.

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) 
2

Jednym ze sposobów, aby to zrobić mogłoby być stworzenie „kotwicy” tabelę z wszystkich możliwych danych ze wszystkich trzech tabel, a następnie użyć 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 
Powiązane problemy