11

postgres を使用して、関連のない 2 つのテーブルを合計しようとしています。MySQL では、次のようにします。

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

これにより、sum_1 と sum_2 という名前の 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 は dud 条件で使用されるため、どちらのサブクエリも結果を生成しない (空にする) ことができ、より大きなクエリに結果がありません。

table1 と table2 の間で CROSS JOIN を実行しているため、作成したクエリが期待どおりの結果を生成したとは思いません。これにより、各 SUM が他のテーブルの行数によって膨張します。table1/table2 のいずれかが空の場合、CROSS JOIN によって X 行 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

ソース テーブルに行がなくても、いずれかのサブクエリからの行は常に1 つだけです。したがって、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);

アイデアは、それぞれに 1 つの行を持つ 2 つのインライン ビューを作成し、それぞれに 1 つの行を持つこれら 2 つのビューに対してデカルト結合を行うことです。

于 2012-10-23T00:28:05.943 に答える