Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 多维数据集+外部联接=额外的空行_Sql_Postgresql_Outer Join_Cube_Rolap - Fatal编程技术网

Sql 多维数据集+外部联接=额外的空行

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

当我在带有外部联接的查询上使用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     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        |