2

First I have 4 Tables

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

(not all num have values in qty1 or qty2 or qty3 or qty4, therefore I need a full join) and my query:

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

Somehow its returning just 1 row of data:

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

But I was expecting like the example at

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

like:

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  |

(I don't know this solves it) However I got similar to the result the box above by changing all the tables to:

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 
4

3 回答 3

2

每个表中的 num 列之间没有匹配项,因此您将获得外部记录。当匹配键上没有匹配项时,记录显示为该列为空。

完全外连接的方式,Table0.num 需要存在于所有其他表中。即,如果 num == 1 仅在 Table0 和 Table1 中,但不在 Table2 和 3 中,则它不会在所有 4 上都匹配,因此是 null 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

我的语法可能有点偏离,并且可能有更有效的方法。但一般的想法是你为每个关系做一个子查询,因为它们是独立的。

于 2013-07-15T19:56:07.170 回答
2

您需要做两件事之一(并且这两件事都假设Table0有所有实例num) -

  1. 如果'leaf'表(1-4)的所有行都已经求和,那么一个简单LEFT JOIN的(在选择中带有a 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 示例

于 2013-07-15T20:20:20.253 回答
-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”)

每次将记录添加到Table0Table1、和时Table2,都应首先将记录添加到并获取并相应地将其放入表中。Table3Table4Tablextablex_id

如果您想加入他们,只需执行以下操作:

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
于 2017-10-18T13:25:20.057 回答