Hitachi

Hitachi Advanced Data Binder SQLリファレンス


7.32.4 導出表の展開が行われないケース

次の条件を1つでも満たす場合,導出表の展開は行われません。

  1. 導出問合せの最も外側の問合せ指定に,SELECT DISTINCTを指定した導出問合せ名をFROM句に指定し,そのFROM句を直接含む問合せ指定中に次の指定がある場合

    • GROUP BY句,HAVING句,または集合関数を指定している場合

      (例)

      SELECT SUM("C1") FROM (SELECT DISTINCT * FROM "T1") AS "V1"
          GROUP BY "C2"
    • 表の結合(結合表を含む)を指定している場合

      (例)

      SELECT * FROM (SELECT DISTINCT * FROM "T1") AS "V1","T1"
          WHERE "V1"."C1"="T1"."C1"
    • 列指定を含む値式から導出される導出列を,選択式に単独の列指定で指定していない場合

      (例)

      SELECT "VC1" FROM (SELECT DISTINCT "C1","C2" FROM "T1") AS "V1"("VC1","VC2")

      導出列VC2が選択式に指定されていないため,導出表V1の展開は行われません。

      SELECT "VC1"*1.05,"VC2" FROM (SELECT DISTINCT * FROM "T1") AS "V1"("VC1","VC2")

      導出列VC1が,選択式に単独の列指定として指定されていないため,導出表V1の展開は行われません。

    • 選択式にスカラ関数RANDOMRANDOM_NORMALRANDOMROW,スカラ副問合せ,またはウィンドウ関数を含む値式を指定している場合

      (例)

      SELECT "VC1","VC2",RANDOM()
          FROM (SELECT DISTINCT "C1","C2" FROM "T1") AS "V1"("VC1","VC2")
    • スカラ関数RANDOMRANDOM_NORMALRANDOMROW,または集合関数のどれかを含み,かつ列指定を含まない値式から導出される導出列を,選択式に単独の列指定で指定していない場合

      (例)

      SELECT "VC1" FROM (SELECT DISTINCT "C1",RANDOM() FROM "T1") AS "V1"("VC1","VC2")
    • 選択式に指定していない値式をソートキーに指定している場合

      (例)

      SELECT * FROM (SELECT DISTINCT * FROM "T1") AS "V1"
          ORDER BY ("C2"+1)
  2. 導出問合せの最も外側の問合せ指定に,GROUP BY句を指定した導出問合せ名をFROM句に指定し,そのFROM句を直接含む問合せ指定中に次の指定がある場合

    • DISTINCT集合関数逆分布関数LISTAGG集合関数,またはARRAY_AGG集合関数を指定している場合

      (例)

      SELECT "C1",SUM(DISTINCT "C2")
          FROM (SELECT "C1","C2" FROM "T1" GROUP BY "C1","C2") AS "V1"
          GROUP BY "C1","C2"
    • 表の結合(結合表を含む)を指定している場合

      (例)

      SELECT * FROM (SELECT "C1","C2" FROM "T1" GROUP BY "C1","C2")
          AS "V1","T1"
    • 述語中に行値構成子を指定している場合

      (例)

      SELECT * FROM (SELECT "C1","C2" FROM "T1" GROUP BY "C1","C2")
          AS "V1" WHERE ("C1","C2") = (10,20)
  3. 導出問合せの最も外側の問合せ指定に,GROUP BY句を指定した導出問合せ名をFROM句に指定し,そのFROM句を直接含む問合せ指定中にGROUP BY句,HAVING句,または集合関数があり,かつ次のどちらかの場合

    • 導出問合せを操作する問合せ指定に指定したグループ化列数と,導出問合せに指定したグループ化列数が異なる場合

      (例)

      SELECT "C1","C2" FROM (SELECT "C1","C2" FROM "T1" GROUP BY "C1","C2","C3") AS "V1"
          GROUP BY "C1","C2"
    • 導出問合せのグループ化列の参照列から導出される導出列を,導出問合せを操作する問合せ指定のグループ化列に単独で指定していない場合

      (例)

      SELECT "C1","C2"+1 FROM (SELECT "C1","C2" FROM "T1" GROUP BY "C1","C2") AS "V1"
          GROUP BY "C1","C2"+1
  4. 導出問合せの最も外側の問合せ指定に,値式を含むGROUP BY句を指定した導出問合せ名をFROM句に指定し,そのFROM句を直接含む問合せ指定中に次の指定がある場合

    • 列指定を含む値式から導出された導出問合せ中のグループ化列を外への参照を行う列として指定している場合

      (例)

      SELECT * FROM (SELECT "G1" FROM "T1" GROUP BY C1+1 "G1") AS "V1"
          WHERE EXISTS (SELECT * FROM "T2" WHERE "T2"."C1" = "V1"."G1")
  5. 導出問合せの最も外側の問合せ指定の選択式に,列指定を含む値式を指定した導出問合せ名をFROM句に指定し,そのFROM句を直接含む問合せ指定中に次の指定がある場合

    • 列指定を含む値式から導出された導出問合せ名の列を,グループ化列かつ外への参照を行う列として選択式またはHAVING句中に指定している場合

      (例)

      SELECT "DC1" FROM (SELECT "C1"+1 AS "DC1" FROM "T1") AS "V1"
          GROUP BY "DC1"
          HAVING EXISTS (SELECT * FROM "T2" WHERE "T2"."C1" = "V1"."DC1")
    • 逆分布関数を複数指定している場合

      (例)

      SELECT MEDIAN("C1")
          FROM (SELECT ABS("C1") AS "C1","C2" FROM "T1") AS "V1"
          HAVING MEDIAN("C1")>100
    • 列指定を含む値式から導出された導出問合せ名の列を,外への参照を行う列として集合関数の引数に指定している場合

      (例)

      SELECT "C1" FROM (SELECT SUBSTR("C1",5) AS "C1","C2" FROM "T1") AS "V1"
          GROUP BY "C1"
          HAVING EXISTS(SELECT * FROM "T1" WHERE MAX("V1"."C1")="C1")
    • 配列要素参照を含む値式から導出された導出問合せ名の列を,行値構成子の行値構成子要素に指定している場合

      (例)

      SELECT "C1" FROM (SELECT "C1"[1] AS "C1","C2"[2] AS "C2" FROM "T1") AS "V1"
          WHERE ("C1","C2") = (1,2)
    • 配列型の列指定を含む値式(ただし,単独で指定した配列型の列指定,およびスカラ関数ARRAY_MAX_CARDINALITYは除く)から導出された導出問合せ名の列を外への参照列として指定している場合

      (例)

      SELECT "C1" FROM (SELECT "C1"[1] AS "C1", "C2"[2] AS "C2" FROM "T1") AS "V1"
          WHERE EXISTS (SELECT * FROM "T2" WHERE "T2"."C1" = "V1"."C2")
      
  6. 導出問合せの最も外側の問合せ指定の選択式に,列指定を含まない値式を指定した導出問合せ名を,結合表でのナル値を補う側の表参照に指定している場合

    (例)

    SELECT * FROM "T1" LEFT OUTER JOIN
                       (SELECT SUBSTR('ABC',2) AS "C1","C2" FROM "T2") AS "V1"
                       ON "T1"."C1"="V1"."C1"
  7. 導出問合せの最も外側の問合せ指定の選択式に,列指定を含まない値式を指定した導出問合せ名をFROM句に指定し,そのFROM句を直接含む問合せ指定中に次の指定がある場合

    • 逆分布関数を複数指定している場合

      (例)

      SELECT MEDIAN("C1")
          FROM (SELECT ABS(100) AS "C1","C2" FROM "T1") AS "V1"
          HAVING MEDIAN("C1")>100
    • 列指定を含まない値式から導出された導出問合せ名の列を,ウィンドウ関数中に指定している場合

      (例)

      SELECT "C2",SUM("C2") OVER(ORDER BY "C1")
           FROM (SELECT SUBSTR('ABC',2) AS "C1","C2" FROM "T1") AS "V1"
  8. 導出問合せの最も外側の問合せ指定の選択式に,スカラ関数RANDOMまたはRANDOM_NORMALを含む値式を指定した導出問合せ名をFROM句に指定し,そのスカラ関数RANDOMまたはRANDOM_NORMALから導出された列をSQL文中に指定している場合

    (例)

    SELECT "C1", "C2" FROM (SELECT "C1"+RANDOM() AS "C1", "C2" FROM "T2") AS "V1"
  9. 導出問合せの最も外側の問合せ指定の選択式に,スカラ関数RANDOMCURSORを含む値式を指定した導出問合せ名をFROM句に指定し,そのFROM句を直接含む問合せ指定中に導出問合せのスカラ関数RANDOMCURSORを含む値式から導出された列を「選択式またはORDER BY句」以外に指定している場合

    (例)

    SELECT "C1","C2"
        FROM (SELECT "C1"+RANDOMCURSOR(1,10,20) AS "C1","C2" FROM "T2") AS "V1"
          WHERE "C1">1000
  10. 導出問合せの最も外側の問合せ指定の選択式に,スカラ関数RANDOMROWを含む値式を指定した導出問合せ名をFROM句に指定し,そのFROM句を直接含む問合せ指定中に次の指定がある場合

    • 導出問合せのスカラ関数RANDOMROWを含む値式から導出された列を,「選択式またはORDER BY句」以外に指定している場合

      (例)

      SELECT "C1","C2"
          FROM (SELECT "C1"+RANDOMROW(1,10,20) AS "C1","C2" FROM "T2") AS "V1"
            WHERE "C1">1000
    • 導出問合せのスカラ関数RANDOMROWを含む値式から導出された列を,集合関数の引数に指定している場合

      (例)

      SELECT SUM("C1")
          FROM (SELECT "C1"+RANDOMROW(1,10,20) AS "C1","C2" FROM "T2") AS "V1"
    • 導出問合せのスカラ関数RANDOMROWを含む値式から導出された列を,ウィンドウ関数中に指定している場合

      (例)

      SELECT "C1",SUM("C2") OVER(ORDER BY "C1")
          FROM (SELECT "C1", "C2"+RANDOMROW(1,10,20) AS "C2" FROM "T2") AS "V1"
    • 導出問合せのスカラ関数RANDOMROWを含む値式から導出された列を,スカラ関数RANDOMROW中に指定している場合

      (例)

      SELECT RANDOMROW(1,"C1","C2")
          FROM (SELECT "C1"+RANDOMROW(1,10,20) AS "C1","C2" FROM "T2") AS "V1"
    • 表の結合(結合表を含む)を指定している場合

      (例)

      SELECT * FROM (SELECT "C1"+RANDOMROW(1,10,20) AS "C1","C2" FROM "T2")
          AS "V1","T1"
  11. 導出問合せの最も外側の問合せ指定の選択式に,?パラメタを含む値式を指定した導出問合せ名をFROM句に指定し,?パラメタから導出された列を問合せ指定中に指定している場合

    (例)

    SELECT "C1" FROM (SELECT SUBSTR("C1",?) AS "C1","C2" FROM "T1") AS "V1"
  12. 導出問合せの最も外側の問合せ指定の選択式に,スカラ副問合せを含む値式を指定した導出問合せ名をFROM句に指定した場合

    (例)

    SELECT "C1" FROM (SELECT (SELECT "C1" FROM "T2") + 10 AS "C1"
                          FROM "T1") AS "V1"
  13. 導出問合せの最も外側の問合せ指定の選択式に,逆分布関数を含む値式を指定した導出問合せ名をFROM句に指定し,逆分布関数から導出された列を問合せ指定中で指定している場合

    (例)

    SELECT "C1" FROM (SELECT MEDIAN("C1") AS "C1",MAX("C2")
                          FROM "T1") AS "V1"
  14. 導出問合せの最も外側の問合せ指定の選択式に,集合関数を指定した導出問合せ名をFROM句に指定し,そのFROM句を直接含む問合せ指定中に次の指定がある場合

    • 値式を含むGROUP BY句,DISTINCT集合関数逆分布関数LISTAGG集合関数,またはARRAY_AGG集合関数を指定している場合

      (例)

      SELECT SUM(DISTINCT "C1")
          FROM (SELECT COUNT("C1") AS "C1" FROM "T1") AS "V1"
          GROUP BY "C1"
    • 表の結合(結合表を含む)を指定している場合

      (例)

      SELECT * FROM (SELECT COUNT("C1") AS "C1" FROM "T1") AS "V1","T1"
          WHERE "V1"."C1"="T1"."C1"
    • 集合関数から導出された導出問合せ名の列を,外への参照を行う列として集合関数の引数に指定している場合

      (例)

      SELECT "C1" FROM (SELECT COUNT("C1") AS "C1" FROM "T1") AS "V1"
          GROUP BY "C1"
          HAVING EXISTS(SELECT * FROM "T2" WHERE MAX("V1"."C1")="C1")
    • 集合関数から導出された導出問合せ名の列を,行値構成子の行値構成子要素に指定している場合

      (例)

      SELECT "C1" FROM (SELECT COUNT("C1") AS "C1",COUNT("C2") AS "C2" FROM "T1") AS "V1"
          WHERE ("C1","C2") = (10,20)
  15. 導出問合せの最も外側の問合せ指定の選択式にLISTAGG集合関数またはARRAY_AGG集合関数を含む値式を指定した導出問合せ名をFROM句に指定し,そのFROM句を直接含む問合せ指定中に,LISTAGG集合関数またはARRAY_AGG集合関数を含む値式から導出された列を外への参照列として指定している場合

    (例)

    SELECT "C1" FROM (SELECT LISTAGG("C1") WITHIN GROUP(ORDER BY "C2") AS "C1"
                          FROM "T1") AS "V1"
        WHERE EXISTS(SELECT * FROM "T2" WHERE "T2"."C1"="V1"."C1")
  16. 導出問合せの最も外側の問合せ指定の選択式に,ARRAY_AGG集合関数を含む値式を指定した導出問合せ名をFROM句に指定し,そのFROM句を直接含む問合せ指定中に次の指定がある場合

    • 導出問合せのARRAY_AGG集合関数を含む値式から導出された列を,ANYを指定した配列要素参照に指定している場合

      (例)

      SELECT "C1" FROM (SELECT ARRAY_AGG("C1") AS "C1" FROM "T1") AS "V1"
          WHERE "C1"[ANY] = 1
  17. 導出問合せの最も外側の問合せ指定に,ウィンドウ関数を指定した導出問合せ名をFROM句に指定している場合

    (例)

    SELECT "C2" FROM (SELECT "C1",AVG("C1") OVER(ORDER BY "C2") AS "C2"
                          FROM "T1") AS "V1"
  18. 導出問合せの最も外側の問合せ指定に,LIMIT句を指定している場合

    (例)

    SELECT "C1","C2" FROM (SELECT "C1","C2" FROM "T1" LIMIT 10) AS "V1"
  19. 導出問合せの最も外側の問合せ指定のWHERE句に行値構成子またはANYを指定した配列要素参照を指定した導出問合せ名を,結合表でのナル値を補う側の表参照に指定している場合

    (例)

    SELECT * FROM "T1" LEFT OUTER JOIN (SELECT * FROM "T2" WHERE ("C1","C2") = (1,2)) AS "V1"
         ON "T1"."C1"="V1"."C1"
  20. 導出問合せの最も外側の問合せ指定に複数の表を指定した導出問合せ名をFROM句に指定し,そのFROM句を直接含む問合せ指定のWHERE句に次の指定がある場合

    • 次の指定がある述語

      • 導出問合せの最も外側の問合せ指定に指定した表の列指定を含む値式から導出された列を指定した,ANYを指定した配列要素参照

      • 導出問合せの最も外側の問合せ指定に指定した上記とは別の表の列指定を含む値式から導出された列

      (例)

      SELECT "VC1","VC2"
        FROM (SELECT "T1"."C1","T2"."C2" FROM "T1","T2") AS "V1"("VC1","VC2")
          WHERE "VC1"[ANY] = "VC2"
    • 次の同じ識別番号を持つANYを指定した配列要素参照

      • 導出問合せの最も外側の問合せ指定に指定した表の列指定を含む値式から導出された列を指定した配列要素参照

      • 導出問合せの最も外側の問合せ指定に指定した上記とは別の表の列指定を含む値式から導出された列を指定した配列要素参照

      SELECT "VC1","VC2"
        FROM (SELECT "T1"."C1","T2"."C2" FROM "T1","T2") AS "V1"("VC1","VC2")
          WHERE "VC1"[ANY(1)] = 1 AND "VC2"[ANY(1)] = 2
  21. 導出問合せの最も外側の問合せ指定に,コンマ結合を指定した導出問合せ名を結合表の表参照に指定している場合

    (例)

    SELECT "VC1","VC2" FROM (SELECT "T1"."C1","T2"."C1" FROM "T1","T2","T3"
                               WHERE "T1"."C1"="T2"."C1"
                                 AND "T2"."C1"="T3"."C1") AS "V1"("VC1","VC2")
                             LEFT JOIN "T3" ON "VC1" = "T3"."C1"
  22. FULL OUTER JOIN中の表参照に導出問合せを指定している場合

    (例)

    SELECT * FROM (SELECT "C1" FROM "T1") AS "V1"
                     FULL OUTER JOIN "T2" ON "V1"."C1"="T2"."C1"
  23. 導出問合せの最も外側の問合せ指定を演算項に持つ集合演算の結果導出される列に,データ型が32,000バイトを超えるVARCHAR型のデータを含んでいる場合

    (例)

    SELECT "C1" FROM (SELECT "C1" FROM "T1"
                      UNION
                      SELECT "DEFINE_SOURCE" FROM "MASTER"."SQL_DEFINE_SOURCE"
                     ) AS "V1"
  24. 導出問合せに指定された集合演算の演算項の問合せ指定を導出問合せと見なしたときに,上記の1.~18.の内部導出表の展開が行われない条件を1つでも満たしている場合

    (例)

    SELECT "C1" FROM (SELECT DISTINCT "C1","C2" FROM "T1"
                      UNION ALL
                      SELECT "C1","C2" FROM "T2"
                     ) AS "V1"

    集合演算の演算項の問合せ指定「SELECT DISTINCT "C1","C2" FROM "T1"」を導出問合せと見なした場合,1.の内部導出表の展開が行われない条件を満たしているため,導出表V1の展開は行われません。

    注※

    導出問合せの最も外側の問合せ指定にSELECT DISTINCTを指定した導出問合せ名をFROM句に指定し,そのFROM句を直接含む問合せ指定中に次の指定がある場合

    • 列指定を含む値式から導出される導出列を,選択式に単独の列指定として指定していない

  25. 導出問合せの最も外側の問合せ指定を演算項に持ち,UNION ALLだけの集合演算を指定した導出問合せ名をFROM句に指定し,そのFROM句を直接含む問合せ指定中に次の指定がある場合

    • GROUP BY句,HAVING句,または集合関数を指定している場合

      (例)

      SELECT "C1","C2"
          FROM (
                SELECT "C1","C2" FROM "T1"
                UNION ALL SELECT "C1","C2" FROM "T2"
               ) AS "V1"
          GROUP BY "C1","C2"
    • 選択式にウィンドウ関数を指定している場合

      (例)

      SELECT "C1",SUM("C1") OVER(ORDER BY "C2")
          FROM (
                SELECT "C1","C2" FROM "T1"
                UNION ALL SELECT "C1","C2" FROM "T2"
                ) AS "V1"
    • 表の結合(結合表を含む)を指定している場合

      (例)

      SELECT * FROM (
                     SELECT "C1", "C2" FROM "T1"
                     UNION ALL SELECT "C1","C2" FROM "T2"
                     ) AS "V1","T3"
    • 選択式に指定していない導出問合せ名の列をソートキーとして指定している場合

      (例)

      SELECT "C1" FROM (
                        SELECT "C1","C2" FROM "T1"
                        UNION ALL SELECT "C1","C2" FROM "T2"
                        ) AS "V1"
          ORDER BY "C2"
    • 選択式に指定していない値式をソートキーに指定している場合

      (例)

      SELECT "C1" FROM (
                        SELECT "C1","C2" FROM "T1"
                        UNION ALL SELECT "C1","C2" FROM "T2"
                        ) AS "V1"
          ORDER BY ("C1"+1)
  26. 導出問合せの最も外側の問合せ指定を演算項に持ち,UNION ALL以外の集合演算子を含む集合演算を指定した導出問合せ名をFROM句に指定し,そのFROM句を直接含む問合せ指定中に次の指定がある場合

    • SELECT DISTINCTを指定している場合

      (例)

      SELECT DISTINCT "C1" FROM (
                                 SELECT "C1" FROM "T1"
                                 EXCEPT ALL SELECT "C1" FROM "T2"
                                 ) AS "V1"
    • GROUP BY句,HAVING句,または集合関数を指定している場合

      (例)

      SELECT "C1","C2" FROM (
                             SELECT "C1","C2" FROM "T1"
                             UNION SELECT "C1","C2" FROM "T2"
                             ) AS "V1"
          GROUP BY "C1","C2"
    • 選択式にウィンドウ関数を指定している場合

      (例)

      SELECT "C1",SUM("C1") OVER(ORDER BY "C2") FROM (
                            SELECT "C1","C2" FROM "T1"
                            INTERSECT ALL SELECT "C1","C2" FROM "T2"
                            ) AS "V1"
    • 表の結合(結合表を含む)を指定している場合

      (例)

      SELECT * FROM (
                     SELECT "C1","C2" FROM "T1"
                     EXCEPT SELECT "C1","C2" FROM "T2"
                     ) AS "V1","T3"
    • 選択式にスカラ関数RANDOMRANDOM_NORMALRANDOMROW,スカラ副問合せ,またはウィンドウ関数を含む値式を指定している場合

      (例)

      SELECT "VC1","VC2",RANDOM() FROM (
                                        SELECT "C1","C2" FROM "T1"
                                        UNION SELECT "C1","C2" FROM "T2"
                                        ) AS "V1"("VC1","VC2")
    • 選択式に単独の列指定で指定されていない導出問合せ名の列が少なくとも1つ存在する場合

      (例)

      SELECT "VC1" FROM (
                         SELECT "C1","C2" FROM "T1"
                         INTERSECT SELECT "C1","C2" FROM "T2"
                         ) AS "V1"("VC1","VC2")

      導出列VC2が選択式に指定されていないため,導出表V1の展開は行われません。

      (例)

      SELECT "VC1"*1.05,"VC2" FROM (
                                    SELECT "C1","C2" FROM "T1"
                                    UNION SELECT "C1","C2" FROM "T2"
                                    ) AS "V1"("VC1","VC2")

      導出列VC1が,選択式に単独の列指定として指定されていないため,導出表V1の展開は行われません。

    • 選択式に指定していない導出問合せ名の列をソートキーとして指定している場合

      (例)

      SELECT "C1" FROM (
                        SELECT "C1","C2" FROM "T1"
                        UNION SELECT "C1","C2" FROM "T2"
                        ) AS "V1"
          ORDER BY "C2"
    • 選択式に指定していない値式をソートキーに指定している場合

      (例)

      SELECT "C1" FROM (
                        SELECT "C1","C2" FROM "T1"
                        UNION SELECT "C1","C2" FROM "T2"
                        ) AS "V1"
          ORDER BY ("C1"+1)