PostgreSQL中多个表的完全外连接

时间:2015-03-02 00:05:07

标签: postgresql join outer-join

在PostgreSQL中,我有N个表,每个表包含两列:idvalue。在每个表格中,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)

但是,如果ida中存在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表进行连接?不要迷失在我的代码中?

我还想指出我在我的例子中做了一些简化。表bc,{{1}},......实际上是对几个物化视图的非常复杂查询的结果。但语法问题仍然存在。

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分组的值相加。