以下是表格结构
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
,E
和F
中显示所有条目,即使在C中没有与它们相关的条目。
所以基本上我必须按C
,A
和E
的每种可能组合对F
中的所有数据进行分组,如果有0
则显示C
{{1}}中没有可用的数据。
我该怎么做?
答案 0 :(得分:3)
利用CROSS JOIN
, LEFT [OUTER] JOIN
和COALESCE
:
如果你想要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
。
在你的最后一个答案中,你在交叉连接后加上一个括号,是什么 那呢?
我引用the manual here:
如有必要,请使用括号来确定嵌套顺序。在 如果没有括号,JOIN会从左到右嵌套。在任何情况下加入 绑定比分隔FROM项目的逗号更紧密。