【问题标题】:Full outer join on multiple tables in PostgreSQLPostgreSQL 中多个表的完全外连接
【发布时间】: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、...实际上是对几个物化视图进行相当复杂的查询的结果。但是语法问题还是一样。

【问题讨论】:

    标签: postgresql join outer-join


    【解决方案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 分组的值相加。

    【讨论】:

      猜你喜欢
      • 2014-08-08
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      • 2014-11-18
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      相关资源
      最近更新 更多