PostgreSQL 中多个表的完全外连接

Posted

技术标签:

【中文标题】PostgreSQL 中多个表的完全外连接【英文标题】:Full outer join on multiple tables in PostgreSQL 【发布时间】:2015-05-02 06:38:02 【问题描述】:

在 PostgreSQL 中,我有 N 表,每个表由两列组成:idvalue。在每个表中,id 是唯一标识符,value 是数字。

我想使用id 加入所有表,并且对于每个id,创建values 的总和,其中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 存在于ac 中但不存在于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)

它只有 3 个表,而且代码已经够丑了,恕我直言。是否有一些优雅、系统的方法来连接N 表?不要迷失在我的代码中?

我还想指出,我在示例中做了一些简化。表abc、...实际上是对几个物化视图进行相当复杂的查询的结果。但是语法问题还是一样。

【问题讨论】:

【参考方案1】:

我知道您需要对 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 因为 union 过滤重复! 然后将所有按 id 分组的值相加。

【讨论】:

以上是关于PostgreSQL 中多个表的完全外连接的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 连接(JOIN)

优化来自多个表的连接查询

Postgresql:基于多个地址字段连接表的更有效方式

9.PostgreSQL的Join,Union,Null

PostgreSQL同表左外连接多表

左外连接和右外连接的区别