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);
좋아, 그럼 거기에 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 행이 있습니다. 두 번째 것은 내가 원했던 대답이다.
여기에 무슨 일이 일어나고 있는지 잘 알고 있습니다. NULL 값은 두 가지 다른 것을 알려주는 데 사용됩니다 ("큐브가이 열의 값을 모두 굴림"또는 "이 행에 오른쪽 테이블에 자식이 없음"). . 나는 그것을 고치는 법을 모른다.