Hitachi

Hitachi Advanced Data Binder SQLリファレンス


7.32.5 導出表の展開有無

導出表の展開有無を次の表に示します。

表7‒48 導出表の展開有無(1/3

導出問合せを操作するSQL文の指定内容

導出問合せの指定内容

SEL_

DIST

GRP

GRP_EXP

SEL_EXP

SEL_

NCOL

SEL_RAND

SEL_

RANDCRS

SEL_

RANDROW

SEL_PRM

SEL_DIST

※5

×

GRP

×

※6

※6

※2

※2

※5

×

GRP_EXP

×

×

×

※5

×

A-FUNC

×

※6,※7

※6,※7

※5

※8

×

D-FUNC

×

×

×

※5

※8

×

I-FUNC2

×

×

×

※5

※8

×

WIN_AGG

×

※5

※8

×

WIN_PAR

×

※5

※8

×

WIN_ORD

×

※5

※8

×

SEL_EXP

※5

※9

×

SEL_RAND

×

※5

×

SEL_RANDROW

×

※5

※9

×

SEL_SUBQ

×

※5

×

SEL_WINDOW

×

※5

×

SEL_CNDRV

×

※5

×

SEL_NCNDRV

※11

※5

×

JOIN

×

×

×

※5

※5

×

IN_J_TBL

×

×

×

※4

×

※5

※5

×

J_TBL※12

×

×

×

※5

※5

×

FJ_TBL

×

×

×

×

×

×

×

×

×

ANY_ARRAY_ELMREF

※5

×

RVC

×

×

※16

※5

×

S_KEY

※5

×

SEXP_KEY

×

※5

※9

×

O_REF

※17

※5

×

O_REF_FUNC

×

×

×

※5

×

その他

※5

※8

※8,※9

×

表7‒49 導出表の展開有無(2/3

導出問合せを操作するSQL文の指定内容

導出問合せの指定内容

SUBQ

SEL_

IFN

FUNC_

COL

FUNC_

EXP

WINDOW

JOIN

CJOIN※12

WHERE_

CE

LIMIT

SEL_DIST

×

×

×

×

GRP

×

×

×

×

GRP_EXP

×

×

×

×

A-FUNC

×

×

※7

※7

×

×

D-FUNC

×

×

×

×

I-FUNC2

×

×

×

×

WIN_AGG

×

×

×

×

WIN_PAR

×

×

×

×

WIN_ORD

×

×

×

×

SEL_EXP

×

×

×

×

SEL_RAND

×

×

×

×

SEL_RANDROW

×

×

×

×

SEL_SUBQ

×

×

×

×

SEL_WINDOW

×

×

×

×

SEL_CNDRV

×

×

×

×

SEL_NCNDRV

×

×

×

×

JOIN

×

×

×

×

×

×

IN_J_TBL

×

×

×

×

×

×

×

×

J_TBL※12

×

×

×

×

×

×

×

FJ_TBL

×

×

×

×

×

×

×

×

×

ANY_ARRAY_ELMREF

×

×

※13

※13

×

※14

×

RVC

×

×

×

×

S_KEY

×

×

×

×

SEXP_KEY

×

×

×

×

O_REF

×

×

※15

×

×

O_REF_FUNC

×

×

×

×

×

×

その他

×

×

×

×

表7‒50 導出表の展開有無(3/3)

導出問合せを操作するSQL文の指定内容

導出問合せの指定内容

U_ALL※3,※10

SET_OP※3,※10

SETOP_

VCH32000

その他

SEL_DIST

※1

×

GRP

×

×

×

GRP_EXP

×

×

×

A-FUNC

×

×

×

D-FUNC

×

×

×

I-FUNC2

×

×

×

WIN_AGG

×

×

×

WIN_PAR

×

×

×

WIN_ORD

×

×

×

SEL_EXP

×

SEL_RAND

×

×

SEL_RANDROW

×

×

SEL_SUBQ

×

×

SEL_WINDOW

×

×

SEL_CNDRV

×

×

SEL_NCNDRV

×

×

JOIN

×

×

×

IN_J_TBL

×

×

×

J_TBL※12

×

×

×

FJ_TBL

×

×

×

×

ANY_ARRAY_ELMREF

×

RVC

×

S_KEY

×

SEXP_KEY

×

×

×

O_REF

×

O_REF_FUNC

×

×

×

その他

×

(凡例)

○:導出表の展開を行います。

△:導出表の展開を行います。ただし,導出問合せを操作するSQL文の指定内容となる個所に,導出問合せの指定内容から導出される導出列を指定した場合は,導出表の展開を行いません。

×:導出表の展開を行いません。

  • A-FUNC:被集約引数に導出問合せ名の列を指定したALL集合関数を含んでいる場合

  • ANY_ARRAY_ELMREFANYを指定した配列要素参照を指定している場合

  • CJOIN:コンマ結合を含んでいる場合

  • D-FUNC:被集約引数に導出問合せ名の列を指定したDISTINCT集合関数LISTAGG集合関数,もしくはARRAY_AGG集合関数を含んでいる場合,または被集約引数に導出問合せ名の列を指定した逆分布関数を1つだけ含んでいる場合

  • I-FUNC2:被集約引数に導出問合せ名の列を指定した逆分布関数を2つ以上含んでいる場合

  • FJ_TBLFULL OUTER JOINの表参照に,導出問合せ名を指定している場合

  • FUNC_COL:集合関数の被集約引数に,列指定だけを指定している場合

  • FUNC_EXP:集合関数の被集約引数に,列指定以外を指定している場合

  • GRPGROUP BY句,HAVING句,または集合関数を含んでいる場合

  • GRP_EXPGROUP BY句に列指定以外(スカラ演算など)を含んでいる場合

  • IN_J_TBL:結合表でのナル値を補う側の表参照に,該当する導出問合せ名を指定している場合

  • JOIN:複数の表を含んでいる場合

  • J_TBL:結合表の表参照に導出問合せ名を指定している場合

  • LIMITLIMIT句を指定している場合

  • O_REF:外への参照列として導出問合せ名の列を指定している場合

  • O_REF_FUNC:外への参照列として,導出問合せ名の列を集合関数の引数に指定している場合

  • RVC:述語中に行値構成子を指定している場合

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

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

  • SEL_IFN:選択式に逆分布関数を指定している場合

  • SEL_DISTSELECT DISTINCTの指定ありの場合

  • SEL_EXP:選択式に列指定以外(スカラ演算など)を含んでいる場合(ただし,値式中に列指定を含んでいる場合)

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

  • SEL_NCOL:選択式に列指定以外から成る値式を含んでいる場合

  • SEL_PRM:選択式に?パラメタを含んでいる場合

  • SEL_RAND:選択式に,スカラ関数RANDOMまたはRANDOM_NORMALを含んでいる場合

  • SEL_RANDCRS:選択式に,スカラ関数RANDOMCURSORを含んでいる場合

  • SEL_RANDROW:選択式に,スカラ関数RANDOMROWを含んでいる場合

  • SEL_SUBQ:選択式にスカラ副問合せを含んでいる場合

  • SEL_WINDOW:選択式にウィンドウ関数を含んでいる場合

  • SET_OPU_ALL以外のケースで集合演算を指定している場合

  • SETOP_VCH32000:集合演算の結果によって導出される列に,データ型が32,000バイトを超えるVARCHAR型の列がある場合

  • SEXP_KEY:選択式に指定した値式と異なる値式をソートキーに指定している場合

    (例)

    SELECT "C1"+"C2","C2" AS "DC1" FROM "T1" ORDER BY "C1"/"C2"
  • SUBQ:選択式に副問合せを含んでいる場合

  • U_ALLUNION ALLだけの集合演算を指定している場合

  • WHERE_CEWHERE句中に次のどちらかを指定している場合

    • 行値構成子

    • ANYを指定した配列要素参照

  • WINDOW:ウィンドウ関数を指定している場合

  • WIN_AGG:ウィンドウ関数として指定した集合関数LAG関数,またはLEAD関数に導出問合せ名の列を指定している場合

  • WIN_PAR:ウィンドウ関数中のウィンドウ分割句に導出問合せ名の列を指定している場合

  • WIN_ORD:ウィンドウ関数中のウィンドウ順序句に導出問合せ名の列を指定している場合

注※1

導出問合せに指定された集合演算で,最後に演算される集合演算子がEXCEPT ALLの場合に限り,導出表の展開は行われません。

(例)展開されない例

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

上記のSQL文の場合,最後に演算されるのがEXCEPT ALLのため,導出表の展開は行われません。

(例)展開される例

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

上記のSQL文の場合,最後に演算されるのがUNION ALLのため,導出表の展開が行われます。

注※2

次の条件をすべて満たしている場合,導出表の展開は行われません。

  1. 値式から導出された導出問合せ名の列を,グループ化列に指定している

  2. 次のどちらかの個所に指定した1.の導出問合せ名の列が,外への参照列である

  • 選択式

    (例)展開されない例

    SELECT (SELECT "C1" FROM "T2" WHERE "T2"."C1" = "V1"."DC1") "DC2"
        FROM (SELECT "C1"+1 AS "DC1" FROM "T1") AS "V1"
        GROUP BY "DC1"
  • 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")
注※3

集合演算を指定した導出表を操作する問合せ指定に指定された副問合せ中にFULL OUTER JOINが指定されている場合,集合演算導出表の展開は行われません。

(例)展開されない例

SELECT * FROM (SELECT "C1","C2" FROM "T1"
               UNION ALL
               SELECT "C1","C2" FROM "T2") "DT2"
    WHERE "C1"=ANY(SELECT "X"."C1" FROM "T3" FULL OUTER JOIN "T4"
                                             ON "T3"."C2"> "T4"."C2")
注※4

導出問合せの最も外側の問合せ指定の選択式に,次のどれかの値式が指定されている場合,導出表の展開は行われません。

  • スカラ関数COALESCE

  • スカラ関数ISNULL

  • スカラ関数NULLIF

  • スカラ関数NVL

  • スカラ関数DECODE

  • スカラ関数LTDECODE

  • CASE

注※5

SQL文中に,導出問合せの指定内容の対象となる導出列を指定した場合だけ,導出表の展開は行われません。

(例)展開されない例

SELECT "DC1" FROM (SELECT RANDOM("C1","C2") AS "DC1" FROM "T1") AS "V1"

上記のSQL文の場合,導出問合せに指定したスカラ関数RANDOMを含む選択式の列に対応する導出列"DC1"を,導出問合せを操作するSQL文に指定しているため,導出表の展開は行われません。

注※6

次の条件をすべて満たしている場合に,導出表の展開が行われます。

  • 導出問合せを操作する問合せ指定に指定したグループ化列数と,導出問合せに指定したグループ化列数が同じである

  • 導出問合せの選択式に指定したグループ化列から導出される導出列すべてを,導出問合せを操作する問合せ指定のグループ化列に指定している

(例1)展開される例

SELECT "C1","C2" 
    FROM (SELECT "C1","C2" FROM "T1" GROUP BY "C1","C2") AS "V1"
    GROUP BY "C1","C2"

(例2)展開される例

SELECT "C1","DC2"
    FROM (SELECT "C1","C2"+1 AS "DC2" FROM "T1" GROUP BY "C1","C2"+1) AS "V1"
    GROUP BY "C1","DC2"
注※7

次の条件をすべて満たしている場合に,導出表の展開が行われます。

  • 導出問合せを操作する問合せ指定にGROUP BY句,またはHAVING句を指定している。

  • 出問合せを操作する問合せ指定に指定したすべての集合関数が,次の条件1または条件2のどちらかを満たす。

    条件1

    • 導出問合せを操作する問合せ指定に指定した集合関数がCOUNT(*)である

    注※

    引数に定数,または定数と等価な値式を指定した集合関数COUNTALL指定)は,集合関数COUNT(*)へ置き換えられ,集合関数COUNT(*)と同じものとして扱われます。

    条件2

    • 導出問合せを操作する問合せ指定に指定した集合関数が次のどれかである

      • ALL集合関数MAX

      • ALL集合関数MIN

      • ALL集合関数SUM

      • ALL集合関数AVG

    • 上記の集合関数の被集約引数として,導出問合せに指定した集合関数から成る導出列を指定している

    (例)展開される例

    SELECT "C1", "C2",SUM("C3")
        FROM (SELECT "C1","C2",COUNT("C3") AS "C3"
                 FROM "T1"
                 GROUP BY "C1","C2") "V1"
        GROUP BY "C1","C2"
注※8

導出問合せの指定内容の対象となる導出列を含む値式を「選択式またはORDER BY句」以外に指定している場合,導出表の展開は行われません。

注※9

導出問合せの指定内容の対象となる導出列をスカラ関数RANDOMROW中に指定している場合,導出表の展開は行われません。

注※10

導出問合せに指定した集合演算の演算項の問合せ指定を導出問合せと見なしたときに,内部導出表が展開されない条件を1つでも満たす場合は,導出表の展開は行われません。

注※11

次のどれかの指定があり,かつ列指定を含まない値式から導出される導出列を,選択式に単独の列指定で指定していない場合は,導出表の展開は行われません。

  • スカラ関数RANDOM

  • スカラ関数RANDOM_NORMAL

  • スカラ関数RANDOMROW

  • 集合関数

注※12

INNER JOINまたはCROSS JOINは,HADBサーバによってコンマ結合に変換されることがあります。そのため,導出問合せに指定したINNER JOINまたはCROSS JOINがコンマ結合に変換される場合,導出問合せにコンマ結合が含まれると見なされます(上記の表のCJOINに該当します)。また,導出問合せを操作する問合せ指定に指定したINNER JOINまたはCROSS JOINがコンマ結合に変換されて,問合せ指定から結合表がなくなる場合,結合表の指定がないと見なされます(上記の表のJ_TBLに該当しなくなります)。

注※13

導出問合せのARRAY_AGG集合関数を含む値式から導出される導出列を,導出問合せを操作する問合せ指定に次の指定をしている場合は,導出表の展開は行われません。

  • ANYを指定した配列要素参照の配列値式

注※14

導出問合せを操作する問合せ指定のWHERE句に次の指定がある場合は,導出表の展開は行われません。

  • 次の指定がある述語

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

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

  • 次の同じ識別番号を持つANYを指定した配列要素参照

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

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

注※15

導出問合せのLISTAGG集合関数またはARRAY_AGG集合関数を含む値式から導出される導出列を外への参照列として指定している場合は,導出表の展開は行われません。

注※16

導出問合せの配列要素参照を含む値式から導出される導出列を行値構成子の行値構成子要素中に指定している場合は,導出表の展開は行われません。

注※17

導出問合せの配列型の列指定を含む値式(ただし,単独で指定した配列型の列指定,およびスカラ関数ARRAY_MAX_CARDINALITYは除く)から導出される導出列を外への参照列として指定している場合は,導出表の展開は行われません。