簡體   English   中英

如何跨兩個不相關的表進行 SUM?

[英]How to do a SUM across two unrelated tables?

我試圖用 postgres 總結兩個不相關的表。 使用 MySQL,我會做這樣的事情:

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

這應該給我一個包含兩列名為 sum_1 和 sum_2 的表。 但是,postgres 沒有給我這個查詢的任何結果。

有任何想法嗎?

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與dud條件一起使用,因此任何子查詢都不會產生任何結果(空)而不會導致更大的查詢沒有結果。

我不認為你所寫的查詢會產生你期望獲得的結果,因為它在table1和table2之間進行CROSS JOIN,這會使每個SUM通過另一個表中的行數來膨脹。 請注意,如果table1 / table2為空,則CROSS JOIN將導致X行乘以0行以返回空結果。

看看這個SQL小提琴並比較結果。

我建議像下面這樣的東西,雖然我還沒有嘗試過。

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

我們的想法是創建兩個內聯視圖,每個視圖都有一行,然后在這兩個視圖上進行笛卡爾連接,每個視圖都有一行。

要結合來自多個的多個聚集,使用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

即使源表中沒有行,也始終從任一子查詢中只有一行。 因此, CROSS JOIN (或者甚至只是子查詢之間的一個低級逗號 - 對於具有較低優先級的交叉連接而言不是那么容易閱讀的簡寫)是最簡單的方法。

請注意,這會在單個聚合行之間產生交叉連接, 而不是多個表的各個行之間的交叉連接,就像問題中的錯誤語句一樣 - 從而相互相乘。

SELECT SUM(table1_column1 + table2_column1)
FROM table1 
JOIN table2
ON table1_id= table2_id
WHERE account_no='${account_no}'

Express-JS 與 PostgreSQL 通過 postman API

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM