Hitachi

Hitachi Advanced Data Binder SQLリファレンス


7.1.1 問合せ式の指定形式および規則

問合せ式には,WITH句と問合せ式本体の組み合わせを指定します。

問合せ式本体には,問合せ指定,または2つの問合せ式本体によって導出される表の集合(和集合,差集合,または積集合)を求める集合演算を指定します。和集合を求める場合はUNIONを,差集合を求める場合はEXCEPTを,積集合を求める場合はINTERSECTを指定します。

WITH句を指定した場合,問合せ式本体の結果によって得られる導出表に問合せ名を付けて,問合せ式本体に指定できます。

また,WITHリスト要素に指定した問合せ名を,そのWITHリスト要素内の問合せ式本体から参照できます(再帰的な検索ができます)。このとき,WITHリスト要素に指定した問合せ名を再帰的問合せ名といい,WITHリスト要素に指定した問合せ式本体を再帰的問合せといいます。

〈この項の構成〉

(1) 指定形式

問合せ式::=〔WITH句問合せ式本体
 
 
  WITH句::=WITH WITHリスト要素〔,WITHリスト要素〕…
    WITHリスト要素::=問合せ名 〔(WITH列リスト)〕 AS (問合せ式本体ORDER BY句LIMIT句〕) 〔最大再帰数指定WITH列リスト::=列名〔,列名〕…
      最大再帰数指定::=/*>> MAX RECURSION 最大再帰数 <<*/
 
  問合せ式本体::={問合せ項問合せ式本体 {UNION|EXCEPT} 〔{ALL|DISTINCT}〕〔集合演算方式指定問合せ項問合せ項::={問合せ一次子問合せ項 INTERSECT 〔{ALL|DISTINCT}〕 問合せ一次子問合せ一次子::={問合せ指定|(問合せ式本体)}
    集合演算方式指定::=/*>> SET OPERATION NOT BY HASH <<*/

(2) 指定形式の説明

(a) WITH句

WITH句::=WITH  WITHリスト要素〔,WITHリスト要素〕…
  WITHリスト要素::=問合せ名 〔(WITH列リスト)〕 AS (問合せ式本体ORDER BY句LIMIT句〕) 〔最大再帰数指定WITH列リスト::=列名〔,列名〕…
    最大再帰数指定::=/*>> MAX RECURSION 最大再帰数 <<*/

AS (問合せ式本体)の結果を一時的な導出表として定義する場合に指定します。WITH句の指定例を次の図に示します。

図7‒1 WITH句の指定例

[図データ]

問合せ名

導出表の名称を指定します。ここで指定した名称が問合せ名として定義されます。WITH句中で,同じ問合せ名を指定することはできません。

WITH列リスト

問合せ名(導出表)の各列の列名を指定します。

WITH列リストに指定する列名の数は,対応する「AS (問合せ式本体)」に指定した問合せ式本体のうち,最も外側の問合せの結果によって導出される列数と同じにしてください。

WITH列リストを省略した場合は,対応する「AS (問合せ式本体)」に指定した問合せ式本体のうち,最も外側の問合せの結果によって導出される列の列名が,問合せ名の列の列名となります。導出される列名の規則については,「6.9 導出列名」を参照してください。

注意事項を次に示します。

  • WITH列リスト中に,同じ列名を指定できません。

  • WITH列リストを省略した場合,問合せ式本体によって導出される列名が重複しないようにしてください。

  • HADBによって自動的に設定される導出列名と重複する可能性があるため,WITH列リストの列名にEXPnnnn_NO_NAMEを指定しないでください。nnnnは,00009999の符号なし整数です。

  • 対応する「AS (問合せ式本体)」に指定した問合せ式本体のうち,最も外側の問合せの結果によって導出される列の数が4,000以下になるようにしてください。

AS (問合せ式本体ORDER BY句LIMIT句〕)

問合せ式本体を指定します。

ここで指定した問合せ式本体から導出表が作成されます。問合せ名に指定した名称が,導出表の名称になります。

なお,問合せ式本体中には,?パラメタを指定できません。

ORDER BY句

問合せ式本体の検索結果を昇順または降順に並べ替える場合に指定します。ORDER BY句を省略した場合,問合せ式本体の検索結果の並び順は保証されません。

ORDER BY句については,「4.4.1 SELECT文の指定形式および規則」を参照してください。

なお,WITHリスト要素にORDER BY句を指定する場合,LIMIT句も一緒に指定する必要があります。

LIMIT句

問合せ式本体の検索結果として取得する行数の最大値を指定します。

LIMIT句については,「7.9 LIMIT句」を参照してください。

なお,再帰的問合せに対しては,LIMIT句を指定できません。

最大再帰数指定
最大再帰数指定::=/*>> MAX RECURSION 最大再帰数 <<*/

再帰的問合せをする際の最大再帰数を指定します。最大再帰数には,再帰可能な回数の上限を符号なし整数定数の形式で指定します。指定規則を次に示します。

  • 最大再帰数指定を省略した場合,最大再帰数に100が仮定されます。

  • 最大再帰数には,0~32,767の符号なし整数定数を指定してください。

  • 再帰数が最大再帰数の値を超えた場合,SQL文がエラーになります。

  • 最大再帰数に0を指定した場合,再帰可能な回数は無制限になります。そのため,0を指定した場合,SQL文の実行が無限に繰り返されるおそれがあります。

  • 再帰的問合せが指定されていない場合,最大再帰数指定の指定は無効になります。

(b) 問合せ式本体

問合せ式本体::={問合せ項問合せ式本体 {UNION|EXCEPT} 〔{ALL|DISTINCT}〕〔集合演算方式指定問合せ項問合せ項::={問合せ一次子問合せ項 INTERSECT 〔{ALL|DISTINCT}〕 問合せ一次子問合せ一次子::={問合せ指定|(問合せ式本体)}
  集合演算方式指定::=/*>> SET OPERATION NOT BY HASH <<*/

問合せ式本体には,次のどちらかを指定します。

  • 問合せ項

  • 問合せ式本体問合せ項によって導出される表の集合(和集合または差集合)を求める集合演算

なお,UNION ALLUNION DISTINCTEXCEPT ALLEXCEPT DISTINCTINTERSECT ALL,およびINTERSECT DISTINCT集合演算子といいます。

問合せ項

問合せ項には,次のどちらかを指定します。

  • 問合せ一次子

  • 問合せ項問合せ一次子の積集合を求める集合演算

UNION|EXCEPT}

和集合を求める場合はUNIONを,差集合を求める場合はEXCEPTを指定します。

{ALL|DISTINCT}:

集合演算の結果に重複した行がある場合,重複した行を排除するかどうかを指定します。

ALL集合演算の結果に重複した行があっても,重複した行を排除しません。

DISTINCT集合演算の集合演算項や,集合演算の結果に重複した行がある場合,重複した行を排除して1つの行にします。

ALLおよびDISTINCTの指定を省略した場合,DISTINCTが仮定されます。

問合せ一次子

問合せ一次子には,問合せ指定,または(問合せ式本体)を指定します。

INTERSECT

積集合を求めるときの指定です。

問合せ指定

問合せ指定を指定します。問合せ指定については,「7.2 問合せ指定」を参照してください。

問合せ式本体

問合せ式本体を指定します。

集合演算方式指定

集合演算方式指定を指定した場合,集合演算の処理方式にハッシュ実行以外の方式が適用されます。集合演算の処理方式については,マニュアルHADB AP開発ガイド集合演算の処理方式を参照してください。

なお,通常は,この指定をする必要はありません。集合演算方式指定を省略した場合,HADBが集合演算の処理方式を決定します。

集合演算方式指定の規則を次に示します。

  • 集合演算EXCEPTに集合演算方式指定を指定しても,その指定は無視されます。

  • 集合演算方式指定は,問合せ式本体中のすべての集合演算に対して(UNION DISTINCTまたはUNION ALLに対して)適用されます。集合演算方式指定が適用されたかどうかは,アクセスパス情報で確認できます。アクセスパス情報の詳細については,マニュアルHADB AP開発ガイド集合演算方式指定を参照してください。

(例)

SELECT "C1" FROM "T1"
UNION                                        ...1
SELECT "C1" FROM "T2"
UNION /*>> SET OPERATION NOT BY HASH <<*/    ...2
SELECT "C1" FROM "T3"

上記の例のように,2.の集合演算に集合演算方式指定を指定した場合,1.の下線部分の集合演算にも集合演算方式指定が適用されます。

(3) 規則

(a) WITH句の規則

  1. 問合せ名が1つの場合,問合せ名の有効範囲は,WITH句の後ろの問合せ式本体です。問合せ名が2つ以上の場合,問合せ名ごとに有効範囲が異なります。問合せ名の有効範囲の例については,「6.8.3 範囲変数の有効範囲」の「(1) SELECT文のFROM句に指定した範囲変数の有効範囲」を参照してください。

  2. WITHリスト要素の問合せ式本体中に副問合せを入れ子で指定する場合,入れ子の数は31回以内にしてください。また,FROM句に指定した表がビュー表または問合せ名の場合,ビュー表または問合せ名に内部導出表を適用したあとの副問合せの入れ子の数が31回以内になるようにしてください。詳細については,「7.3.1 副問合せの指定形式および規則」の「(4) 規則」の「(a) 副問合せ共通の規則」を参照してください。

    (例1)

    WITH "Q1" AS 
      (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM
      (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM
      (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM
      (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM
      (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM
      (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM
      (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM "T1") AS DT32
      ) AS DT31 ) AS DT30 ) AS DT29 ) AS DT28 ) AS DT27 ) AS DT26 ) AS DT25 ) AS DT24
      ) AS DT23 ) AS DT22 ) AS DT21 ) AS DT20 ) AS DT19 ) AS DT18 ) AS DT17 ) AS DT16
      ) AS DT15 ) AS DT14 ) AS DT13 ) AS DT12 ) AS DT11 ) AS DT10 ) AS DT9 ) AS DT8
      ) AS DT7 ) AS DT6 ) AS DT5 ) AS DT4 ) AS DT3 ) AS DT2 ) AS DT1 ) AS DT0 )
    SELECT * FROM "Q1"

    上記の例の場合,問合せ名Q1の副問合せの入れ子の数は32回となり,上限を超えているため,SELECT文がエラーになります。

    なお,T1は実表とします。

    (例2)

    WITH "Q2" AS 
      (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM
      (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM
      (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM
      (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM
      (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM
      (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM
      (SELECT * FROM (SELECT * FROM "T1") AS DT30
      ) AS DT29 ) AS DT28 ) AS DT27 ) AS DT26 ) AS DT25 ) AS DT24 ) AS DT23 ) AS DT22
      ) AS DT21 ) AS DT20 ) AS DT19 ) AS DT18 ) AS DT17 ) AS DT16 ) AS DT15 ) AS DT14
      ) AS DT13 ) AS DT12 ) AS DT11 ) AS DT10 ) AS DT9 ) AS DT8 ) AS DT7 ) AS DT6
      ) AS DT5 ) AS DT4 ) AS DT3 ) AS DT2 ) AS DT1 ) AS DT0 ),
      "Q3" AS (SELECT * FROM "Q2"),
      "Q4" AS (SELECT * FROM "Q3")
    SELECT * FROM "Q4"
    • 問合せ名Q2の副問合せの入れ子の数は30回で,上限を超えていません。

    • 問合せ名Q3の副問合せの入れ子の数は,内部導出表が適用された結果,31回となりますが,上限を超えていません。

    • 問合せ名Q4の副問合せの入れ子の数は,内部導出表が適用された結果,32回となります。上限を超えているため,SELECT文がエラーになります。

    なお,T1は実表とします。

    (例3)

    WITH "Q5" AS (SELECT "C1" FROM (SELECT "C1" FROM "T1") AS DT
                  UNION ALL
                  SELECT "C1"+1 FROM "Q5" WHERE "C1"+1 < 5),
         "Q6" AS (SELECT * FROM
                  (SELECT * FROM
                   (SELECT * FROM
                    (SELECT * FROM
                     (SELECT * FROM
                      (SELECT * FROM "Q5") AS DT4
                     ) AS DT3
                    ) AS DT2
                   ) AS DT1
                  ) AS DT0),
          "Q7" AS
          (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM
          (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM
          (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM
          (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM
          (SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM
          (SELECT * FROM "Q6") AS DT23
          ) AS DT22 ) AS DT21 ) AS DT20 ) AS DT19 ) AS DT18
          ) AS DT17 ) AS DT16 ) AS DT15 ) AS DT14 ) AS DT13
          ) AS DT12 ) AS DT11 ) AS DT10 ) AS DT9 ) AS DT8
          ) AS DT7 ) AS DT6 ) AS DT5 ) AS DT4 ) AS DT3
          ) AS DT2 ) AS DT1 ) AS DT0 )
    SELECT * FROM "Q7"
    • 問合せ名Q5の副問合せの入れ子の数は1回で,上限を超えていません。

    • 問合せ名Q6の副問合せの入れ子の数は,内部導出表が適用された結果,7回となりますが,上限を超えていません。

    • 問合せ名Q7の副問合せの入れ子の数は,内部導出表が適用された結果,32回となります。上限を超えているため,SELECT文がエラーになります。

    なお,T1は実表とします。

(b) 再帰的問合せの規則

  1. 再帰的問合せには,その再帰的問合せを参照する再帰的問合せ名を含まない問合せ指定と,再帰的問合せを参照する再帰的問合せ名を含む問合せ指定を,それぞれ1つ以上指定する必要があります。このとき,再帰的問合せを参照する再帰的問合せ名を含まない問合せ指定アンカーメンバといい,再帰的問合せを参照する再帰的問合せ名を含む問合せ指定再帰的メンバといいます。

    注※ 副問合せを除きます。

  2. 再帰的メンバを複数指定する場合は,各再帰的メンバを集合演算(UNION ALL)の演算項となるように指定してください。

  3. 再帰的問合せ中で最後に指定するアンカーメンバと最初に指定する再帰的メンバは,集合演算(UNION ALL)の演算項となるように指定してください。アンカーメンバと再帰的メンバの指定例を次に示します。

    (例)

    WITH "Q1"("C1","C2")
        AS (SELECT "C1","C2" FROM "T1" WHERE "C1" > 0                          ...1
            UNION ALL
            SELECT "Q1"."C1"+1,"T1"."C2" FROM "Q1","T1" WHERE "Q1"."C1" < 5)   ...2
    SELECT * FROM "Q1"
    [説明]

    1.下線部分がアンカーメンバです。

    2.下線部分が再帰的メンバです。

  4. すべてのアンカーメンバは,再帰的問合せ中で最初に指定した再帰的メンバよりも前に指定してください。

  5. 再帰的問合せの再帰的メンバのFROM句に,その再帰的問合せを参照する再帰的問合せ名を2つ以上指定できません。

  6. 再帰的問合せ中の副問合せに,その再帰的問合せを参照する再帰的問合せ名は指定できません。

  7. 再帰的メンバ中には,次の指定はできません。また,再帰的メンバ中の副問合せにも,次の指定はできません。

    • SELECT DISTINCT

    • GROUP BY

    • HAVING

    • LIMIT

    • 集合関数

    • LEFT OUTER JOIN

    • RIGHT OUTER JOIN

    • FULL OUTER JOIN

    ただし,次の個所には上記の指定ができます。

    • 再帰的メンバ中に指定したビュー表

    • 再帰的メンバ中の副問合せに指定したビュー表

    • 問合せ名から導出される導出問合せ

  8. 次に示す2つの項目のデータ型とデータ長を同じにしてください。

    • 再帰的問合せ中に指定したすべての再帰的メンバを集合演算した結果から導出される表の各構成列※1のデータ型とデータ長

    • すべてのアンカーメンバを集合演算した結果から導出される表の各構成列※2のデータ型とデータ長

    注※1 再帰的メンバが1つの場合は,再帰的メンバの選択式が該当します。

    注※2 アンカーメンバが1つの場合は,アンカーメンバの選択式が該当します。

  9. 次に示す条件下での再帰的問合せの検索の流れについて説明します。

    • 再帰的問合せ中に指定したすべてのアンカーメンバを集合演算した問合せ式本体をQ0とする

    • Q0の検索結果をX0とする

    • 再帰的問合せ中に指定したすべての再帰的メンバを集合演算した問合せ式本体をQiとする

    • Qiの検索結果をXiとする

    • 再帰数をiとする

    再帰的問合せの検索の流れ

    1.Q0を検索する(検索結果はX0

    2.検索結果X0を再帰的問合せの結果とする

    3.前回の検索結果Xi-1を基にQiを検索する(検索結果はXi

    4.検索結果Xiによって次のどちらかの処理を行う

    • 検索結果Xiが空行でない場合は,検索結果Xiを再帰的問合せの結果として3.に戻る

    • 検索結果Xiが空行の場合は,再帰的問合せを終了する

    (例)
    WITH "REC"("VAL") AS (
        SELECT * FROM (VALUES(1))                          ←アンカーメンバ
        UNION ALL
        SELECT "VAL" + 1 FROM "REC" WHERE "VAL" + 1 <= 5   ←再帰的メンバ
        )
    SELECT "VAL" FROM "REC"

    上記のSQL文の実行結果の例

    [図データ]

    上記のSQL文の場合,再帰数は4回になります。

(c) 集合演算の規則

  1. 集合演算の評価順序は,括弧内,INTERSECTUNIONまたはEXCEPTの順になります。

  2. 集合演算の対象となる問合せ項問合せ項問合せ項問合せ一次子,または問合せ一次子問合せ一次子によって導出される表を,それぞれ行の集合と見なし,集合演算が実行されます。

  3. 集合演算の対象となる表(各問合せ項によって導出された表)の列数と並び順が,同じである必要があります。

    (例)

    [図データ]

    また,対応する列のデータ型は,比較できるデータ型である必要があります。上記の例の場合,表T1C1列と表T2C1列,表T1C2列と表T2C2列が比較できるデータ型である必要があります。

    比較できるデータ型については,「6.2.2 変換,代入,比較できるデータ型」の「(1) 比較できるデータ型」を参照してください。

    ただし,次のデータは,集合演算の場合は比較できません。

    • DATE型のデータと,日付を表す既定の入力表現の文字データ

    • TIME型のデータと,時刻を表す既定の入力表現の文字データ

    • TIMESTAMP型のデータと,時刻印を表す既定の入力表現の文字データ

    既定の入力表現については,「6.3.3 既定の文字列表現」を参照してください。

  4. 集合演算によって導出される表の列名は,集合演算に指定した問合せ項によって導出される表の列名によって決まります。集合演算によって導出される表の列名規則については,「6.9.2 問合せの結果の導出列名の決定規則」の「(1) 問合せ式の場合」を参照してください。

  5. 集合演算によって導出される表の列数と並び順は,集合演算の対象とした表(各問合せ項によって導出された表)の構成列と同じになります。なお,対応する列が1つでも非ナル値制約なし(ナル値を許す)の場合は,導出された表のすべての列が非ナル値制約なし(ナル値を許す)として集合演算が実行されます。

  6. 集合演算によって導出される表の列のデータ型とデータ長は,集合演算の対象とした表(各問合せ項によって導出された表)の対応する構成列のデータ型およびデータ長によって決まります。詳細については,「7.21.2 値式の結果のデータ型」を参照してください。

  7. Q1およびQ2を集合演算の集合演算項とします。この場合,「Q1 集合演算 Q2」の結果の行数は,次の表のようになります。

    表7‒1 集合演算の結果の行数

    集合演算の指定

    集合演算の結果の行数

    ALLの指定がない場合

    ALLの指定がある場合

    UNION

    • 0(m=0かつn=0の場合)

    • 1(m>0またはn>0の場合)

    mn

    EXCEPT

    • 0(m=0またはn>0の場合)

    • 1(m>0かつn=0の場合)

    MAX(mn,0)

    INTERSECT

    • 0(m=0またはn=0の場合)

    • 1(m>0かつn>0の場合)

    MIN(mn

    ある行RQ1中に含まれている行数をmQ2中に含まれている行数をnとしています。

  8. 問合せ式本体を指定したSQL文中に指定している集合演算がすべてUNIONの場合,指定できる集合演算の数は最大1,023個になります。ただし,指定した集合演算にEXCEPTまたはINTERSECTがある場合は,指定できる集合演算の数は最大63個になります。

    なお,SQL文中にビュー表を指定している場合は,CREATE VIEW文で指定した問合せ式に基づいた内部導出表が適用されます。集合演算の最大数の規則は,この内部導出表に対して適用されます。

  9. 問合せ式本体を指定したSQL文中に指定できる外結合(FULL OUTER JOIN)の数は,最大63個になります。

  10. DISTINCTの指定がある集合演算中に指定された集合演算は,DISTINCTの指定があるものとして処理されることがあります。

  11. 集合演算の集合演算項に指定した問合せ指定の選択式の値式には,配列データを指定できません。

(4) 例題

例題1(WITH句の例)

販売履歴表(SALESLIST)と商品表(PRODUCTSLIST)から,売り上げ金額の最大値(QMAXSALES)を商品名(PUR-NAME)ごとに求めます。

WITH "QT1"("QCODE","QMAXSALES") AS
    (SELECT "PUR-CODE",MAX("PRICE"*"QUANTITY") FROM "SALESLIST"
         GROUP BY "PUR-CODE")
SELECT "PUR-NAME","QMAXSALES" FROM "QT1" 
    INNER JOIN "PRODUCTSLIST" ON "QCODE"="PUR-CODE"

下線部分がWITH句の指定です。

例題2(集合演算の和集合の例)

支店Aの販売履歴表(SALESLIST_A)と支店Bの販売履歴表(SALESLIST_B)から,支店Aと支店Bのすべての販売履歴を取得します。

SELECT "A"."USERID","A"."PUR-CODE","A"."PUR-NUM"
    FROM "SALESLIST_A" "A"
UNION ALL
SELECT "B"."USERID","B"."PUR-CODE","B"."PUR-NUM"
    FROM "SALESLIST_B" "B"

[図データ]

例題3(集合演算の和集合の例)

支店Aの販売履歴表(SALESLIST_A)と支店Bの販売履歴表(SALESLIST_B)から,支店Aと支店Bの少なくとも一方で買い物をしたことがある顧客の顧客ID(USERID)を取得します。

SELECT "A"."USERID"
    FROM "SALESLIST_A" "A"
UNION DISTINCT
SELECT "B"."USERID"
    FROM "SALESLIST_B" "B"

[図データ]

例題4(集合演算の差集合の例)

支店Aの販売履歴表(SALESLIST_A)と支店Bの販売履歴表(SALESLIST_B)から,支店Aでは買い物をしたことがあるが,支店Bでは買い物をしたことがない顧客の顧客ID(USERID)を取得します。

SELECT "A"."USERID"
    FROM "SALESLIST_A" "A"
EXCEPT
SELECT "B"."USERID"
    FROM "SALESLIST_B" "B"

[図データ]

例題5(集合演算の積集合の例)

支店Aの販売履歴表(SALESLIST_A)と支店Bの販売履歴表(SALESLIST_B)から,支店Aと支店Bの両方で買い物をしたことがある顧客の顧客ID(USERID)を取得します。

SELECT "A"."USERID"
    FROM "SALESLIST_A" "A"
INTERSECT
SELECT "B"."USERID"
    FROM "SALESLIST_B" "B"

[図データ]

例題6(再帰的問合せの例)

部品Parts_Bを製造するために必要な部品のうち,在庫がない部品を求めます。

WITH "V1"("ID","PARENT","NAME","QUANTITY") AS (
  SELECT "A"."ID","A"."PARENT","A"."NAME","A"."QUANTITY"
      FROM "BOMS" "A" WHERE "A"."ID"=2
  UNION ALL
  SELECT "A"."ID","A"."PARENT","A"."NAME","A"."QUANTITY"
      FROM "V1", "BOMS" "A" WHERE "A"."PARENT" = "V1"."ID"
  )
SELECT "NAME","QUANTITY" FROM "V1" WHERE "QUANTITY"=0

[図データ]

部品の在庫数などが格納されている部品表(BOMS)の構成と,部品の階層構造は次のとおりです。

[図データ]

(5) 留意事項

  1. 集合演算を指定した場合,作業表が作成されることがあります。作業表が作成される作業表用DBエリアの容量が正しく見積もられていない場合,性能低下の原因となることがあります。作業表用DBエリアの容量見積もりについては,マニュアルHADB システム構築・運用ガイドを参照してください。作業表の詳細については,マニュアルHADB AP開発ガイド作業表が作成されるSQLを実行する際の考慮点を参照してください。

  2. 集合演算の処理方式にハッシュ実行が適用された場合,適切な大きさのハッシュテーブル領域が必要になります。ハッシュテーブル領域の大きさは,サーバ定義またはクライアント定義のadb_sql_exe_hashtbl_area_sizeオペランドで指定します。集合演算の処理方式については,マニュアルHADB AP開発ガイド集合演算の処理方式を参照してください。

  3. 集合演算の処理方式にハッシュ実行が適用された場合,導出表が作成されます。導出表の相関名は,HADBが次の名称規則に従って決定します。

    ##DRVTBL_xxxxxxxxxx

    xxxxxxxxxxは,10桁の整数です。

  4. 次の述語をB-treeインデクスを使用して評価する場合,表副問合せに指定された集合演算は,DISTINCTの指定があるものとして処理されることがあります。

    • 表副問合せが指定されたIN述語

    • 限定述語(=ANY指定または=SOME指定)