OUTER JOINを使用するクエリでPostgreSQLのCUBEを使用すると、キューブ自身の「すべてが結合された」全NULL結果と区別できない余分なすべてのNULL行が生成されます。CUBE +外部結合=余分なNULL行
CREATE TABLE species
(id SERIAL PRIMARY KEY,
name TEXT);
CREATE TABLE pet
(species_id INTEGER REFERENCES species(id),
is_adult BOOLEAN,
number INTEGER)
;
INSERT INTO species VALUES
(1, 'cat'), (2, 'dog');
INSERT INTO pet VALUES
(1, true, 3), (1, false, 1), (2, true, 1), (null, true, 2);
OK、そう7匹のペットがあるが合計:
SELECT * FROM (
SELECT name, is_adult, SUM(number)
FROM pet p
JOIN species s ON (p.species_id = s.id)
GROUP BY CUBE (name, is_adult)) subq
WHERE name IS NULL
AND is_adult IS NULL;
name | is_adult | sum
------+----------+-----
| | 5
(1 row)
5ペット:
SELECT SUM(number) FROM pet;
sum
-----
7
(1 row)
は今、キューブの合計行を見て?ああ、そうです。種のないペットは含まれていないからです。私は外部結合が必要です。
SELECT * FROM (
SELECT name, is_adult, SUM(number)
FROM pet p
LEFT OUTER JOIN species s ON (p.species_id = s.id)
GROUP BY CUBE (name, is_adult)) subq
WHERE name IS NULL
AND is_adult IS NULL;
name | is_adult | sum
------+----------+-----
| | 2
| | 7
(2 rows)
マイキューブには2つの全ヌル行があります。 2番目は私が望む答えです。
私はここで何が起こっているのか理解しています:NULL値は、2つの異なることを伝えるために使用されます(「キューブはこの列の値をすべてロールアップしました」または「この行には右側テーブルに子がありません」) 。私はちょうどそれを修正する方法を知らない。