当我在带有 OUTER JOIN 的查询上使用 PostgreSQL 的CUBE时,我得到一个额外的全 NULL 行,该行无法与多维数据集自己的“所有组合”全 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);
好的,所以总共有 7 只宠物:
SELECT SUM(number) FROM pet;
sum
-----
7
(1 row)
现在看看立方体的总行:
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 * 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 个全空行;第二个是我想要的答案。
我半明白这里发生了什么:NULL 值用于表示两种不同的事物(“多维数据集已汇总了该列的所有值”或“该行在右侧表中没有子项”)。我只是不知道如何解决它。