PostgreSQL 中多个表的完全外部联接
Full outer join on multiple tables in PostgreSQL
在 PostgreSQL 中,我有 N
table,每个包含两列:id
和 value
。在每个 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)
但它不适用于 a
和 c
中存在 id
而 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 table 秒,恕我直言,代码已经够丑陋了。是否有一些优雅、系统的方法来连接 N
tables?不要迷失在我的代码中?
我还想指出,我在示例中做了一些简化。表 a
、b
、c
、...实际上是对多个物化视图进行相当复杂的查询的结果。但是句法问题还是一样。
我了解到您需要对 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 分组的值相加。
在 PostgreSQL 中,我有 N
table,每个包含两列:id
和 value
。在每个 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)
但它不适用于 a
和 c
中存在 id
而 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 table 秒,恕我直言,代码已经够丑陋了。是否有一些优雅、系统的方法来连接 N
tables?不要迷失在我的代码中?
我还想指出,我在示例中做了一些简化。表 a
、b
、c
、...实际上是对多个物化视图进行相当复杂的查询的结果。但是句法问题还是一样。
我了解到您需要对 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 分组的值相加。