11

我试图用 postgres 总结两个不相关的表。使用 MySQL,我会做这样的事情:

SELECT SUM(table1.col1) AS sum_1, SUM(table2.col1) AS sum_2 FROM table1, table2

这应该给我一个表,其中包含名为 sum_1 和 sum_2 的两列。但是,postgres 没有给我这个查询的任何结果。

有任何想法吗?

4

4 回答 4

13
SELECT (SELECT SUM(table1.col1) FROM table1) AS sum_1,
       (SELECT SUM(table2.col1) FROM table2) AS sum_2;

你也可以这样写:

SELECT t1.sum_c1, t1.sum_c2, t2.sum_t2_c1
FROM
(
     SELECT SUM(col1) sum_c1,
            SUM(col2) sum_c2
 FROM table1
) t1
FULL OUTER JOIN
(
     SELECT SUM(col1) sum_t2_c1
     FROM table2
) t2 ON 1=1;

FULL JOIN 与无效条件一起使用,这样任何一个子查询都不会产生任何结果(空),而不会导致更大的查询没有结果。

我认为您编写的查询不会产生您期望得到的结果,因为它在 table1 和 table2 之间进行交叉连接,这会使每个 SUM 膨胀另一个表中的行数。请注意,如果 table1/table2 为空,则 CROSS JOIN 将导致 X 行乘 0 行返回空结果。

查看这个SQL Fiddle并比较结果。

于 2012-10-22T23:49:53.937 回答
2

要组合来自多个表的多个聚合,请使用:CROSS JOIN

SELECT sum_1, sum_2, sum_3, sum_4
FROM 
    (SELECT sum(col1) AS sum_1, sum(col2) AS sum_2 FROM table1) t1
CROSS JOIN
    (SELECT sum(col3) AS sum_3, sum(col4) AS sum_4 FROM table2) t2

任何一个子查询中总是只有一行,即使源表中没有行。因此,a CROSS JOIN(或者甚至只是子查询之间的一个低级逗号——对于具有较低优先级的交叉连接来说,这不是那么容易阅读的简写)是最简单的方法。

请注意,这会在单个聚合行之间产生交叉连接,而不是在多个表的各个行之间产生交叉连接,就像您在问题中的错误陈述那样 - 从而相互相乘。

于 2012-10-23T01:07:14.163 回答
1

我建议类似以下内容,尽管我没有尝试过。

select sum1, sum2
from
   (select sum(col1) sum1 from table1),
   (select sum(col1) sum2 from table2);

这个想法是创建两个内联视图,每个视图都有一行,然后对这两个视图进行笛卡尔连接,每个视图都有一行。

于 2012-10-23T00:28:05.943 回答
0
SELECT SUM(table1_column1 + table2_column1)
FROM table1 
JOIN table2
ON table1_id= table2_id
WHERE account_no='${account_no}'

Express-JS 与 PostgreSQL 通过邮递员 API

于 2021-11-29T13:02:50.260 回答