2.4.1 副問合せ指定の形式と規則
- 〈この項の構成〉
(1) 機能
表を検索して得られる値,又は値の集合を指定します。
副問合せの種類を次に示します。
-
スカラ副問合せ
スカラ副問合せとは,結果の列数が1列,結果の行数が1行以下の副問合せを示します。
-
行副問合せ
行副問合せとは,結果の列数が2列以上,結果の行数が1行以下の副問合せを示します。
-
表副問合せ
表副問合せとは,結果の列数が1列以上,結果の行数が0行以上の副問合せを示します。
各副問合せは,次に示す箇所に指定します。
- スカラ副問合せ
-
-
値式を指定できる箇所
-
- 行副問合せ
-
-
行値構成子を指定できる箇所
-
UPDATE文のSET句
-
- 表副問合せ
-
-
IN述語の右側
-
限定述語の右側
-
EXISTS述語
-
FROM句の導出表
-
(2) 使用権限
表に対するSELECT権限を持つユーザが,その表を検索する副問合せを実行できます。
(3) 形式
スカラ副問合せ::=副問合せ 行副問合せ::=副問合せ 表副問合せ::=副問合せ 副問合せ::=(〔副問合せ実行方式のSQL最適化指定〕問合せ式本体)
(5) 述語(IN述語,比較述語,限定述語,及びEXISTS述語)中,又はFROM句の導出表の副問合せの規則
-
述語中,又は導出表の副問合せの選択式には,結果が次のデータ型となる値式は指定できません。
-
BLOB
-
最大長が32,001バイト以上のBINARY
-
抽象データ型
-
-
EXISTS述語の副問合せで*又は表指定.*を指定した場合は,次のようになります。
-
集合演算を指定しない場合
集合関数以外のその副問合せで許される任意の1列を意味します。
-
集合演算を指定した場合
*を指定した場合は,その問合せ指定のFROM句で指定したすべての表のすべての列(予備列を除く)を,FROM句で指定した表の順序で指定することを意味します。各表中の列の順序は,表定義時に指定した順序になります。
表指定.*を指定した場合は,指定した表のすべての列(予備列を除く)を,表定義時に指定した順序で指定することを意味します。
-
(6) 規則
-
副問合せの結果は,非ナル値制約なし(ナル値を許します)になります。ただし,FROM句の導出表に指定した表副問合せの結果は,その問合せ式の結果の制約となります。
-
行値構成子に指定した行副問合せの結果の列数は,最大255個です。
-
UPDATEのSET句に指定した行副問合せの結果の列数は,最大30,000個です。
-
表副問合せの結果の列数は,最大255個です。ただし,FROM句の導出表の表副問合せの結果の列数は,最大30,000個です。
-
スカラ副問合せ及び行副問合せを指定する場合は,結果の行数は1行以下でなければなりません。
-
スカラ副問合せの結果が0行の場合,結果の値はナル値になります。
-
行副問合せの結果が0行の場合,結果は構成要素がすべてナル値となる行になります。
-
副問合せ中の選択式には,結果のデータ型が次に示すデータ型の値式は指定できません。
-
BLOB
-
最大長が32,001バイト以上のBINARY
-
抽象データ型
-
BOOLEAN
ただし,UPDATE文のSET句中で,更新値として直接指定したスカラ副問合せ及び行副問合せの選択式については,上記制限はありません。
また,XMLQUERY関数のXML問合せ変数の値式に指定したスカラ副問合せ中の選択式には,XML型の値式としてXMLAGG集合関数が指定できます。
-
-
副問合せ中の選択式には,〔表指定.〕ROWは指定できません。
-
副問合せ中の選択式にWRITE指定,GET_JAVA_STORED_ROUTINE_SOURCE指定,及びウィンドウ関数は指定できません。
-
副問合せ中の選択式には,添字のない繰返し列を指定できません。
ただし,UPDATE文のSET句中で,更新値として直接指定したスカラ副問合せ及び行副問合せの選択式については,上記の制限はありません。
-
集合関数の引数に指定する値式中に,副問合せは指定できません。
-
副問合せ中に予備列は指定できません。
(7) 指定例
-
SELECT文中の限定述語中で表副問合せを指定した場合
SELECT DISTINCT SNAME FROM ZAIKO WHERE SURYO > ALL (SELECT SURYO FROM ZAIKO WHERE SNAME = N'ソックス')
-
UPDATE文のSET句でスカラ副問合せを指定した場合
在庫表(ZAIKO)の商品コード(SCODE)列が302Sの商品の在庫量(ZSURYO)列を,在庫表と同じ列定義情報を持つ在庫表2(ZAIKO2)の商品コード(SCODE)列が302Sの商品の在庫量(ZSURYO)に変更します。
UPDATE ZAIKO SET ZSURYO = (SELECT ZSURYO FROM ZAIKO2 WHERE SCODE = '302S') WHERE SCODE = '302S'
-
UPDATE文のSET句で行副問合せを指定した場合
在庫表(ZAIKO)の商品コード(SCODE)列が302Sの商品の在庫量(ZSURYO)列と単価(TANKA)列を,在庫表と同じ列定義情報を持つ在庫表2(ZAIKO2)の商品コード(SCODE)列が302Sの商品の在庫量(ZSURYO)と単価(TANKA)に変更します。
UPDATE ZAIKO SET (TANKA,ZSURYO) = (SELECT TANKA,ZSURYO FROM ZAIKO2 WHERE SCODE = '302S') WHERE SCODE = '302S'