在PostgreSQL中,我有N
个表,每个表包含两列:id
和value
。在每个表格中,id
是唯一标识符,value
是数字。
我想使用id
加入所有表格,并为每个id
创建value
存在id
的所有表格的总和(意思是id可能只出现在表的子集中)。
我正在尝试以下查询:
SELECT COALESCE(a.id, b.id, c.id) AS id,
COALESCE(a.value,0) + COALESCE(b.value,0) + COALESCE(c.value.0) AS value
FROM
a
FULL OUTER JOIN
b
ON (a.id=b.id)
FULL OUTER JOIN
c
ON (b.id=c.id)
但是,如果id
和a
中存在c
,而b
中没有SELECT COALESCE(x.id, c.id) AS id, x.value+c.value AS value
FROM
(SELECT COALESCE(a.id, b.id), a.value+b.value AS value
FROM
a
FULL OUTER JOIN
b
ON (a.id=b.id)
) AS x
FULL OUTER JOIN
c
ON (x.id = c.id)
,则不适用。
我想我必须做一些包围:
N
只有3张桌子而且代码已经足够难看了。是否有一些优雅,系统的方法如何为a
表进行连接?不要迷失在我的代码中?
我还想指出我在我的例子中做了一些简化。表b
,c
,{{1}},......实际上是对几个物化视图的非常复杂查询的结果。但语法问题仍然存在。
答案 0 :(得分:2)
我知道你需要对N个表中的值求和并按id分组,对吗?
为此,我会这样做:
Select x.id, sum (x.value) from (
Select * from a
Union all
Select * from b
Union all........
) as x group by x.id;
由于n个表由相同的字段组成,你可以将它们联合起来,创建一个包含所有表中所有id - value元组的大表。使用union all因为联合过滤器重复! 然后将所有按id分组的值相加。