5.11.10 導出問合せを指定したSQL文の探索条件に関する等価変換(導出問合せのWHERE句への移動)
導出問合せを指定したSQL文のWHERE句に指定された探索条件を,導出問合せのWHERE句に移動する等価変換を行います。導出問合せについては,マニュアルHADB SQLリファレンスの導出問合せおよび導出問合せ名を参照してください。
等価変換の例を次に示します。例中のC1,C2,C3は列名を意味しています。
- 〈この項の構成〉
(1) 等価変換される例
(a) 例1(導出問合せが問合せ指定の場合)
- [説明]
-
導出問合せを指定したSQL文のWHERE句に指定された条件左側の列指定は,導出問合せに指定された問合せ指定の選択式("T1"."C1")を基に導出された導出列("D1"."C1")です。この条件は,等価変換の適用条件を満たしているため,導出問合せを指定したSQL文の探索条件に関する等価変換が適用されます。
(b) 例2(導出問合せが問合せ式の場合)
- [説明]
-
導出問合せを指定したSQL文のWHERE句に指定された条件左側の列指定は,導出問合せに指定された問合せ式の選択式("T1"."C1","T2"."C1")を基に導出された導出列("D1"."C1")です。この条件は,等価変換の適用条件を満たしているため,導出問合せを指定したSQL文の探索条件に関する等価変換が適用されます。
(c) 例3(導出問合せが問合せ指定の場合)
- [説明]
-
導出問合せを指定したSQL文のWHERE句に指定された論理演算のOR条件に含まれる列指定は,導出問合せに指定された問合せ指定の選択式("T1"."C1","T1"."C2","T1"."C3")を基に導出された導出列("D1"."C1","D1"."C2","D1"."C3")です。この論理演算のOR条件は,等価変換の適用条件を満たしているため,導出問合せを指定したSQL文の探索条件に関する等価変換が適用されます。
(d) 例4(導出問合せが問合せ式の場合)
- [説明]
-
導出問合せを指定したSQL文のWHERE句に指定された論理演算のOR条件に含まれる列指定は,導出問合せに指定された問合せ式の選択式("T1"."C1","T1"."C2","T1"."C3","T2"."C1","T2"."C2","T2"."C3")を基に導出された導出列("D1"."C1","D1"."C2","D1"."C3")です。この論理演算のOR条件は,等価変換の適用条件を満たしているため,導出問合せを指定したSQL文の探索条件に関する等価変換が適用されます。
(e) 例5(導出問合せが問合せ指定の場合)
- [説明]
-
導出問合せを指定したSQL文のWHERE句に指定されたIN述語の左側の行値構成子の列指定は,導出問合せに指定された問合せ指定の選択式("T1"."C1","T1"."C2")を基に導出された導出列("D1"."C1","D1"."C2")です。この条件は,等価変換の適用条件を満たしているため,導出問合せを指定したSQL文の探索条件に関する等価変換が適用されます。
(2) 等価変換される条件の形式
等価変換される条件の形式を次に示します。
-
比較述語の場合
・列指定 比較演算子 {定数|?パラメタ|日時情報取得関数|ユーザ情報取得関数} ・{定数|?パラメタ|日時情報取得関数|ユーザ情報取得関数} 比較演算子 列指定 ・CONTAINS(列指定,検索条件式文字列) > 0
-
BETWEEN述語の場合
列指定 〔NOT〕 BETWEEN {定数|?パラメタ|日時情報取得関数|ユーザ情報取得関数} AND {定数|?パラメタ|日時情報取得関数|ユーザ情報取得関数}
-
行値構成子を指定していないIN述語の場合
列指定 〔NOT〕 IN ( {定数|?パラメタ|日時情報取得関数|ユーザ情報取得関数}} 〔,{定数|?パラメタ|日時情報取得関数|ユーザ情報取得関数}〕…)
-
行値構成子を指定しているIN述語の場合
行値構成子1 〔NOT〕 IN (行値構成子2 〔,行値構成子2〕…) 行値構成子1::=(列指定 〔,列指定〕…) 行値構成子2::=({定数|?パラメタ|日時情報取得関数|ユーザ情報取得関数} 〔,{定数|?パラメタ|日時情報取得関数|ユーザ情報取得関数}〕…)
-
LIKE述語の場合
列指定 〔NOT〕 LIKE パターン文字列 〔ESCAPE エスケープ文字〕 パターン文字列::={定数|?パラメタ|日時情報取得関数|ユーザ情報取得関数} エスケープ文字::={定数|?パラメタ}
-
LIKE_REGEX述語の場合
列指定 〔NOT〕 LIKE_REGEX 正規表現文字列 〔FLAG {I|IGNORECASE}〕 正規表現文字列::=定数
-
NULL述語の場合
列指定 IS 〔NOT〕 NULL
列指定に配列型の列が指定されている場合,等価変換は行われません。
(3) 留意事項
-
探索条件の列指定に指定された導出列の基となる導出問合せの選択式が,列指定の場合に等価変換が行われます。
-
導出問合せにウィンドウ関数が指定されている場合,等価変換は行われません。
-
導出問合せが導出問合せを指定したSQL文に展開された場合,等価変換は行われません。導出問合せの展開については,マニュアルHADB SQLリファレンスの内部導出表を参照してください。
-
次のような導出問合せの場合,等価変換は行われません。
-
導出問合せとしてビュー表名を指定し,同じビュー表名をSQL文中に複数指定した場合
-
導出問合せとしてWITHリスト要素に指定した問合せ名を指定し,同じ問合せ名をSQL文中に複数指定した場合
-
WITHリスト要素が複数指定されていて,導出問合せとしてWITHリスト要素に指定した問合せ名を指定した場合
-
INNER JOINだけを指定した結合表以外の結合表中に,導出問合せを指定した場合
-
導出問合せとして表値構成子を指定した場合
-
導出問合せが再帰的問合せの場合
-
-
次に示すすべての条件を満たす場合に,導出問合せを指定したSQL文の探索条件に関する等価変換が適用されます。
-
論理演算のOR条件中に指定された条件が,導出問合せを指定したSQL文の探索条件に関する等価変換の対象となる探索条件の形式を満たしている
-
すべての列指定が同一の導出表の構成列である
-
-
論理演算のOR条件に対して,次に示す等価変換が適用される場合は,次に示す等価変換が適用されたあとに,導出問合せを指定したSQL文の探索条件に関する等価変換が適用されます。
-
OR条件の中の条件をOR条件の外側に抜き出す等価変換
-
OR条件の中の=条件から作成したIN条件をORの外側に追加する等価変換
上記の等価変換については,「5.11.2 OR条件に関する等価変換(OR条件の外側への抜き出し)」,および「5.11.3 OR条件に関する等価変換(IN条件への変換)」を参照してください。
-
-
論理演算のNOT条件中に指定された条件,および副問合せを含む条件は,等価変換の対象になりません。
-
列指定に指定する列が外への参照列の場合,等価変換は行われません。外への参照列については,マニュアルHADB SQLリファレンスの副問合せの指定形式および規則を参照してください。
-
スカラ演算中に定数だけを指定している場合,そのスカラ演算は定数として扱われることがあります。定数と等価なスカラ演算については,マニュアルHADB SQLリファレンスの値式の指定形式および規則を参照してください。