PostgreSQL 中多个表的完全外部联接

Full outer join on multiple tables in PostgreSQL

在 PostgreSQL 中,我有 N table,每个包含两列:idvalue。在每个 table 中,id 是一个唯一标识符,value 是数字。

我想使用 id 加入所有 table,并为每个 id 创建所有 [=43] 的 value 的总和=]s 其中 id 存在(意味着 id 可能仅存在于 tables 的子集中)。

我正在尝试以下查询:

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)

但它不适用于 ac 中存在 idb 中不存在的情况。

我想我必须做一些像这样的包围:

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 table 秒,恕我直言,代码已经够丑陋了。是否有一些优雅、系统的方法来连接 N tables?不要迷失在我的代码中?

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

我了解到您需要对 N table 中的值求和并按 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 个 table 由相同的字段组成,您可以将它们联合起来创建一个大 table,其中包含来自所有 table 的所有 id - 值元组。使用 union all 因为 union 过滤重复项! 然后将所有按 id 分组的值相加。