2013-07-15 75 views
1

首先,我有4個表SQL全外連接多個表

 
Table0, Columns: num, desc 
Table1, Columns: num, qty1 
Table2, Columns: num, qty2 
Table3, Columns: num, qty3 
Table4, Columns: num, qty4 

(不是所有NUM在qty1或qty2或qty3或qty4值,所以我需要一個完整的連接) 和我的查詢:

SELECT Table0.num, SUM(Table1.qty1), SUM(Table2.qty2), SUM(Table3.qty3), SUM(Table4.qty4) 
FROM Table0 
FULL OUTER JOIN Table1 ON Table0.num = Table1.num 
FULL OUTER JOIN Table2 ON Table0.num = Table2.num 
FULL OUTER JOIN Table3 ON Table0.num = Table3.num 
FULL OUTER JOIN Table4 ON Table0.num = Table4.num 
GROUP BY Table0.num 

不知怎的,它返回僅1行數據:

 
num | qty1 | qty2 | qty3 | qty4 | 
--------------------------------- 
    | 100 | 20 | 77 | 969 | 

但我期待像在

http://www.w3schools.com/sql/sql_join_full.asp

像例如:

 
num | qty1 | qty2 | qty3 | qty4 | 
--------------------------------- 
1 | 0 | 2 | 3 | 2 | 
2 | 1 | 0 | 0 | 0 | 
3 | 7 | 0 | 9 | 0 | 
4 | 0 | 0 | 0 | 10 | 
5 | 0 | 0 | 7 | 0 | 
6 | 8 | 2 | 9 | 3 | 
7 | 0 | 1 | 0 | 0 |

(我不知道這個解決它) 但是我得到了類似的結果上方的框改變所有表:

 
Table1, Columns: num, qty1, qty2, qty3, qty4 
Table2, Columns: num, qty2, qty1, qty3, qty4 
Table3, Columns: num, qty3, qty1, qty2, qty4 
Table4, Columns: num, qty4, qty1, qty2, qty3
+7

這是相當令人印象深刻,它的所有,返回任何數據因爲MySQL不支持'FULL OUTER JOIN'。 – eggyal

+0

需要向我們展示這些表中的行。它會出現Table0.num包含null或空白,而不是您所期望的值。 – AaronLS

+0

Table0.num沒有空的空值 – user1618180

回答

2

你需要做兩件事情之一(和這兩個假設Table0num所有實例) - 如果所有的行都已經被概括爲「葉」表(1

  1. - 4 ),然後一個簡單的LEFT JOIN(在選擇COALESCE())就足夠了 - 你甚至不需要GROUP BY

  2. 如果需要行總結,你會需要之前總結他們的加入,因爲每NUM否則多行不同的表會導致結果

事情是這樣的:

SELECT Table0.num, COALESCE(Table1.qty, 0), COALESCE(Table2.qty, 0), 
        COALESCE(Table3.qty, 0), COALESCE(Table4.qty, 0) 
FROM Table0 
LEFT JOIN (SELECT num, SUM(qty1) as qty 
      FROM Table1 
      GROUP BY num) Table1 
ON Table1.num = Table0.num 
LEFT JOIN (SELECT num, SUM(qty2) as qty 
      FROM Table2 
      GROUP BY num) Table2 
ON Table2.num = Table0.num 
LEFT JOIN (SELECT num, SUM(qty3) as qty 
      FROM Table3 
      GROUP BY num) Table3 
ON Table3.num = Table0.num 
LEFT JOIN (SELECT num, SUM(qty4) as qty 
      FROM Table4 
      GROUP BY num) Table4 
ON Table4.num = Table0.num 

(工作SQLFiddle example

1

每個表中的num列之間沒有匹配,因此您正在獲取外部記錄。當匹配鍵不匹配時,記錄將與該列一起顯示爲空。

完全外連接的方式,Table0.num需要存在於所有其他表中。即如果num == 1僅在Table0和Table1中,但不在Table2和3中,則它不會在所有4上匹配,因此爲空num。

你可能需要的是更多的東西一樣

SELECT Table0.num, 
    (Select SUM(Table1.qty1) From Table1 Where Table1.num = Table0.num) as one, 
    (Select SUM(Table2.qty1) From Table2 Where Table2.num = Table0.num) as two, 
    ... 
From Table0 

我的語法可能有點過,有可能是更有效的辦法。但總體思路是你爲每個關係做一個子查詢,因爲它們是獨立的。

+0

以及如果我的查詢是像「JOIN」而不是「全外部聯接」我會得到結果.. – user1618180

+0

問題不在於你是否使用內部/外部聯接,它只是沒有所有4之間的相關性表。表0和其他表之間只有一個關聯。即table1與table2無關。我更新了一個例子,將table0獨立地與每個其他表相關聯。 – AaronLS

-2

有一個變通解決。你可以加一張附加表加入你的表格。例如:

Tablex;列:tablex_id (PK, AI)(新創建的表)

Table0;列:tablex_id, num, desc(增加了新欄位'tablex_id')

Table1;列:tablex_id, num, qty1(增加了新欄位'tablex_id')

Table2;列:tablex_id, num, qty2(增加了新的字段'tablex_id')

Table3;列:tablex_id, num, qty3(增加了新的字段'tablex_id')

Table4;列:tablex_id, num, qty4增加了新的領域「tablex_id」)

每次添加記錄Table0Table1Table2Table3Table4,你應該添加記錄Tablex第一,並獲得tablex_id並把它放在你的桌子(s)。

如果你想加入他們的行列,只是做這樣的事情:

select t0.desc, t1.qty, t2.qty, t3.qty, t4.qty 
from Tablex tx 
left join Table0 t0 
    on tx.tablex_id = t0.tablex_id 
left join Table0 t1 
    on tx.tablex_id = t1.tablex_id 
left join Table2 t2 
    on tx.tablex_id = t2.tablex_id 
left join Table3 t3 
    on tx.tablex_id = t3.tablex_id 
left join Table4 t4 
on tx.tablex_id = t4.tablex_id