0

これがテーブル構造です

Table A (id, name)
Table B (id, A-id)
Table C (id, quantity, B-id, D-id)
Table D (id, E-id, F-id)
Table E (id, name)
Table F (id, name)

このような結果を得たい

A.name | E.name | F.name | SUM(C.quantity) 
-------------------------------------------
foo    | aaa    | zzz    | 50
-------------------------------------------
foo    | aaa    | xxx    | 0
-------------------------------------------
foo    | bbb    | www    | 10
-------------------------------------------
bar    | aaa    | zzz    | 12
-------------------------------------------
bar    | aaa    | xxx    | 1
-------------------------------------------
bar    | bbb    | www    | 30
-------------------------------------------

A、、にすべてのエントリを表示する必要がありますが、Cにはそれらに関連するエントリはEありFません。

したがって、基本的には、、、、およびのすべての可能な組み合わせですべてのデータをグループ化し、にC使用A可能なデータがないかどうかを表示する必要があります。EF0C

それ、どうやったら出来るの?

4

1 に答える 1

3

を利用しCROSS JOINLEFT [OUTER] JOINCOALESCE

CROSS JOIN非常に珍しく、多くの行を生成する可能性のあるを必要とする場合は、次のようになります。更新後はさらに積極的にbなり、dオプションになりました。

SELECT a.name AS a_name, e.name AS e_name, f.name AS f_name
      ,COALESCE(sum(c.quantity), 0) As sum_quantity
FROM   a
CROSS  JOIN e
CROSS  JOIN f
LEFT   JOIN b ON b.a_id = a.id
LEFT   JOIN d ON d.e_id = e.id
             AND d.f_id = f.id
LEFT   JOIN c ON c.b_id = b.id
             AND c.d_id = d.id
GROUP  BY 1,2,3;

仕様が不足cているため、両方が一致する場合にのみ参加します。b_id d_id

コメントの追加のQ

最後の答えでは、クロス結合の後に括弧を付けましたが、それは何をしますか?

ここでマニュアルを引用します:

ネストの順序を決定するには、必要に応じて括弧を使用します。括弧がない場合、JOINは左から右にネストします。いずれの場合も、JOINは、FROM項目を区切るコンマよりも緊密にバインドされます。

于 2013-03-25T08:40:52.297 に答える