2

最初に私は4つのテーブルを持っています

Table0、列: num、desc
表 1、列: num、qty1
Table2、列: num、qty2
Table3、列: num、qty3
Table4、列: 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行のデータのみを返します:

番号 | 数量1 | 数量2 | 数量3 | 数量4 |
----------------------------------
    | | 100 | 20 | 77 | 969 |

しかし、私は例のように期待していました

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

お気に入り:

番号 | 数量1 | 数量2 | 数量3 | 数量4 |
----------------------------------
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 |

(これで解決するかどうかはわかりません)ただし、すべてのテーブルを次のように変更すると、上記のボックスの結果と同様の結果が得られました。

表 1、列: num、qty1、qty2、qty3、qty4
表 2、列: num、qty2、qty1、qty3、qty4
表 3、列: num、qty3、qty1、qty2、qty4
表 4、列: num、qty4、qty1、qty2、qty3
4

3 に答える 3

2

2つのことのいずれかを行う必要があります(これらは両方とも、 のTable0すべてのインスタンスがあることを前提としていますnum)-

  1. 「リーフ」テーブル (1 ~ 4) のすべての行が既に合計されている場合は、単純なLEFT JOIN(COALESCE()選択に a を含む) で十分です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

各テーブルの num 列間に一致がないため、外部レコードを取得しています。一致キーに一致がない場合と同様に、レコードはその列が null として表示されます。

完全外部結合の方法では、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 に答える