互联网上有很多分组集示例,例如下面示例中的查询 Q1。但是查询 Q2 不同,因为 A2 是一个分组列,它被用作 SUM() 的参数。
根据 SQL 标准,以下哪一项对于 Q2 是正确的(任何版本自 2003 年以来支持分组集)?如果(1)正确,请参照标准说明原因。
A2 被 NULL 替换,除非它位于聚合的参数中。这种解释将给出以下结果 R1。这是 Oracle 的行为(这似乎更有用)。
A2 被 NULL 替换,包括它在聚合中的使用位置:这意味着聚合将返回 NULL。这种解释将给出以下结果 R2。这就是我对 SQL 标准的理解(可能不正确)。
示例代码:
-- Setup
create table A (A1 int, A2 int, A3 int);
insert into A values (1, 1, 100);
insert into A values (1, 2, 40);
insert into A values (2, 1, 70);
insert into A values (5, 1, 90);
-- Query Q1
-- Expected/Observed results:
--
-- A1 A2 SUM(A3)
-- ---------- ---------- ----------
-- 1 - 140
-- 2 - 70
-- 5 - 90
-- - 1 260
-- - 2 40
-- - - 300
select A1, A2, sum (A3)
from A
group by grouping sets ((A1), (A2), ())
order by 1, 2;
-- Query Q2
-- Results R1 (Oracle):
-- A1 A2 SUM(A2)
-- ---------- ---------- ----------
-- 1 - 3
-- 2 - 1
-- 5 - 1
-- - 1 3
-- - 2 2
-- - - 5
--
-- Results R2 (SQL Standard?):
-- A1 A2 SUM(A2)
-- ---------- ---------- ----------
-- 1 - -
-- 2 - -
-- 5 - -
-- - 1 3
-- - 2 2
-- - - - -- NULL row
select A1, A2, sum (A2)
from A
group by grouping sets ((A1), (A2), ())
order by 1, 2;
我从 SQL 2003 7.9 Syntax 17 中了解到这一点,它描述了如何用 NULL 替换列。但是,我可能错过或误解了其他地方排除聚合参数的规则。
m) For each GS_i:
iii) Case:
1) If GS_i is an <ordinary grouping set>, then
A) Transform SL2 to obtain SL3, and transform HC to obtain
HC3, as follows:
II) Replace each <column reference> in SL2 and HC that
references PC_k by "CAST(NULL AS DTPCk)"