2

以下の例のクエリ Q1 のように、インターネット上には多くのグループ化セットの例があります。ただし、A2 はグループ化列であり、SUM() の引数として使用されるため、クエリ Q2 は異なります。

SQL 標準 (任意のバージョン) に従って、第 2 四半期について正しいものはどれですか?2003年以降グループ化セットをサポートする)? (1)が正しい場合、基準を参照して理由を説明してください。

  1. A2 は、集計の引数に含まれていない限り、NULL に置き換えられます。この解釈により、以下の結果 R1 が得られます。これは Oracle の動作です (こちらの方が便利なようです)。

  2. 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 構文 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)"
4

1 に答える 1