Sql 多维数据集+外部联接=额外的空行
当我在带有外部联接的查询上使用PostgreSQL时,我会得到一个额外的all NULL行,它不能与多维数据集自己的all组合all NULL结果区分开来Sql 多维数据集+外部联接=额外的空行,sql,postgresql,outer-join,cube,rolap,Sql,Postgresql,Outer Join,Cube,Rolap,当我在带有外部联接的查询上使用PostgreSQL时,我会得到一个额外的all NULL行,它不能与多维数据集自己的all组合all NULL结果区分开来 CREATE TABLE species ( id SERIAL PRIMARY KEY, name TEXT); CREATE TABLE pet ( species_id INTEGER REFERENCES species(id), is_adult BOOLEAN, number
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值用于表示两个不同的东西多维数据集已汇总了此列的所有值,或者此行在右侧表中没有子项。我只是不知道怎么修
空值用于表示多维数据集具有两个不同的内容
汇总此列的所有值,或者此行中没有子项
右边的桌子
为了区分一个空值和另一个空值,可以使用分组。。。功能,见表9-55:
分组args。。。整数位掩码,指示哪些参数
未包含在当前分组集中
操作与分组集一起使用请参见第节
7.2.4区分结果行。分组操作的参数没有实际计算,但它们必须完全匹配
关联查询的GROUP BY子句中给定的表达式
数量位分配时,最右边的参数为
最低有效位;如果对应的表达式
包含在生成的分组集的分组条件中
结果行,如果不是,则为1
第二个是我想要的答案
试试这个:
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)
HAVING grouping(name,is_adult) = 3
name |is_adult |sum |
-----|---------|-----|
| |7 |
还请检查此查询以了解分组功能的工作原理:
SELECT name, is_adult, SUM(number), grouping(name,is_adult)
FROM pet p
LEFT OUTER JOIN species s ON (p.species_id = s.id)
GROUP BY CUBE (name, is_adult)
name |is_adult |sum |grouping |
-----|---------|----|---------|
cat |false |1 |0 |
cat |true |3 |0 |
cat | |4 |1 |
dog |true |1 |0 |
dog | |1 |1 |
|true |2 |0 |
| |2 |1 |
| |7 |3 |
|false |1 |2 |
|true |6 |2 |
SELECT name, is_adult, SUM(number), grouping(name,is_adult)
FROM pet p
LEFT OUTER JOIN species s ON (p.species_id = s.id)
GROUP BY CUBE (name, is_adult)
name |is_adult |sum |grouping |
-----|---------|----|---------|
cat |false |1 |0 |
cat |true |3 |0 |
cat | |4 |1 |
dog |true |1 |0 |
dog | |1 |1 |
|true |2 |0 |
| |2 |1 |
| |7 |3 |
|false |1 |2 |
|true |6 |2 |