スカラー サブクエリーの定義
スカラー サブクエリーは、1つの値の最大値を返すことができるサブクエリー式です。
- 相関関係にある
- 非相関
相関スカラー サブクエリーは、相関する外部テーブル セットの各行に単一の値を返します。
非相関スカラー サブクエリーは、それを含む問合わせに単一の値を返します。
相関スカラーsubqueryは、相関する外部テーブルの集合の拡張列と考えることができます。同様に、非相関スカラーsubqueryは、パラメータ化された値と考えることができます。
そのため、相関スカラーsubqueryは文内に列と同じ方法で指定できます。また、非相関スカラーsubqueryは、列またはパラメータ化された値が許容される任意の場所にパラメータ化された値と同じ方法で指定できます。これには、DML文の各種の句でスタンドアロンの式として指定するスカラーsubqueryや、式中に指定したスカラーsubqueryも含まれます。
ANSI準拠
スカラー サブクエリーは、ANSI SQL:2011規格に準拠しています。
SQL文でのスカラー サブクエリーの指定
ルールと制限を以下に示します。
- スカラー サブクエリーは、1つ以上の外部のテーブルと相関させることができます。
- スカラー サブクエリーは、サブクエリー(スカラーまたは非スカラーのどちらでも)の入れ子レベルを持つことができます。
- スカラー サブクエリーは、相関または非相関のどちらかになります。
- スカラー サブクエリーでは、結合(内部と外部の両方)や集約、その他同様のSQL DML文の属性を指定できます。
- 述部の右側のオペランドとして指定されたスカラー サブクエリーは、複数の列を返すことができます。ただし、文のその他の場所や式中に指定されたスカラー サブクエリーは、選択リストで単一の列または列式を指定する必要があります。
- スカラー サブクエリーは、スカラー サブクエリーをサポートしていないSQL DML文に指定することはできません。
スカラー サブクエリーをサポートするDML文は、次のとおりです。
- ABORT
- DELETE
- INSERT
- ROLLBACK
- SELECT
再帰的問合わせの再帰文、およびSELECT AND CONSUME文では、スカラー サブクエリーをサポートしていません。
- UPDATE
- UPDATE (Upsert形式)
UPDATE (アップサート形式)のSETまたはWHERE句の条件に、相関スカラー サブクエリーを指定することはできません。
- スカラー サブクエリーをサポートしているが使用上の制限に違反している文では、スカラー サブクエリーを指定することはできません。
- スカラー サブクエリーの結果の基数は、1より大きくなることはありません。
- スカラー サブクエリーが0行を返す場合、その問合わせはnullと評価されます。
例えば、以下のWHERE句は、prodtableの内に一致する行のないsalestable内の行に対してTRUEと評価されます。
SELECT … FROM salestable AS s WHERE (SELECT 1 FROM prodtable AS p WHERE s.prod_no = p.prod_no) IS NULL;
- 次に示す例外を除いて、DDL文にスカラー サブクエリーを指定することはできません。
- CREATE MACRO
- CREATE RECURSIVE VIEW
再帰的ビュー定義のシード文に、スカラー サブクエリーを指定することはできますが、再帰文には指定できません。
- CREATE TABLE … AS
- CREATE TRIGGER
- CREATE VIEW
- REPLACE MACRO
- REPLACE TRIGGER
- REPLACE VIEW
結合インデックスの定義には、スカラー サブクエリーを指定できません。
- 再帰文の再帰文に、スカラー サブクエリーを指定することはできません。
- SELECT AND CONSUME文に、スカラー サブクエリーを指定することはできません。
- UPDATE (アップサート形式)文のSETまたはWHERE句の条件に、相関スカラー サブクエリーを指定することはできません。
- 識別列に割り当てられた値として、単純なINSERT文の値リストに、非相関スカラー サブクエリーを指定することはできません。
- 単純なINSERTの値リストの値として、行トリガーの本体に、非相関スカラー サブクエリーを指定することはできません。
- MERGE文のON句に、相関スカラー サブクエリーを指定することはできません。
- 値リストに相関スカラー サブクエリーを指定することはできません。
例えば、次のINSERT文はエラーを返します。
INSERT INTO t1 (1,2,3 (SELECT d2 FROM t2 WHERE a2=t1.a1));
値リストは単純な値のリストで、その値は定数またはパラメータ化された値のいずれかになります。そのため、基本データ型の値を返す非相関スカラーsubqueryのみを、値リストに指定できます。UDTまたはLOBデータの列を返すスカラーsubqueryを、値リストに指定することはできません。
- 別名化されたスカラー サブクエリー(SSQ)式の前方参照は、参照する式の最上位レベルでのみ使用できます。つまり、別名化されたSSQの参照は、参照する式内に定義された別のSELECTブロック内にネストできません。例えば、SSQ式は、別名化されたSSQ式の前方参照を選択リスト、WHERE句、GROUP BY句、またはHAVING句に含めることができます。
SELECT (SELECT ssq2+a1 FROM t1) AS ssq1, (SELECT MAX(b3) FROM t3) AS ssq2 FROM t2;
前方参照は、参照する式内に定義された別の問合わせブロック内にネストできません。たとえば、次の文にはSSQ式ssq1からssq2への前方参照が含まれていますが、ssq1内のSELECTブロック内にネストされているため、subqueryの不正な使用を示すエラーが返されます。
SELECT (SELECT (SEL ssq2) + a1 FROM t1) AS ssq1, (SELECT MAX(b3) FROM t3) AS ssq2 FROM t2;
エラーを回避するには、以下のように選択リスト内で2つの式を入れ替えます。
SELECT (SELECT MAX(b3) FROM t3) AS ssq2, (SELECT (SEL ssq2) + a1 FROM t1) AS ssq1 FROM t2;
関連トピック
スカラー サブクエリーの詳細については、検索条件内のSUBQUERYの指定を参照してください。