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 中没有与它们相关的条目。EF

所以基本上我必须按, 和C的所有可能组合对所有数据进行分组AEF显示.0C

我怎么做?

4

1 回答 1

3

利用CROSS JOIN,LEFT [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 回答