PostgreSQL 中多个表的完全外连接
Posted
技术标签:
【中文标题】PostgreSQL 中多个表的完全外连接【英文标题】:Full outer join on multiple tables in PostgreSQL 【发布时间】:2015-05-02 06:38:02 【问题描述】:在 PostgreSQL 中,我有 N
表,每个表由两列组成:id
和 value
。在每个表中,id
是唯一标识符,value
是数字。
我想使用id
加入所有表,并且对于每个id
,创建value
s 的总和,其中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)
它只有 3 个表,而且代码已经够丑了,恕我直言。是否有一些优雅、系统的方法来连接N
表?不要迷失在我的代码中?
我还想指出,我在示例中做了一些简化。表a
、b
、c
、...实际上是对几个物化视图进行相当复杂的查询的结果。但是语法问题还是一样。
【问题讨论】:
【参考方案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 中多个表的完全外连接的主要内容,如果未能解决你的问题,请参考以下文章