2013-07-15 46 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