>>-+--+--+-nickname---+---------------------+---+-------------------------+---------------+-> | | +-table-name-+ | '-| correlation-clause |--' | | | '-view-name--' | | | '--+-ONLY--+---(--+-table-name-+---)--' | | '-OUTER-' '-view-name--' | +-TABLE--(--function-name--(--+--------------------+---)----)--| correlation-clause |--+ | | .-,------------. | | | | V | | | | '----expression---+--' | +-+-------+--(fullselect)--| correlation-clause |--------------------------------------+ | '-TABLE-' | '-joined-table-------------------------------------------------------------------------' >-------------------------------------------------------------->< correlation-clause .-AS-. |---+----+--correlation-name--+----------------------------+----| | .-,--------------. | | V | | '-(-----column-name---+---)--'
表参照として指定する各 table-name (表名)、view-name (視点名)、 または nickname (ニックネーム) は、 アプリケーション・サーバーの既存の表、視点、またはニックネーム、 あるいは表参照を含む全選択の前に定義された共通表式 (共通表式 を参照) の table-name を指定するものでなければなりません。 table-name (表名) がタイプ付き表を参照する場合、 その名前はその表およびその表の副表 (table-name の列のみ) の UNION ALL (全合併) を表します。 同様に、view-name (視点名) がタイプ付き視点を参照する場合、 その名前はその視点およびその視点の副視点 (view-name の列のみ) の UNION ALL を表します。
ONLY(table-name ) または ONLY(view-name ) を使用した場合は、 適正な副表または副視点の行は含まれません。 ONLY に指定した table-name に副表がない場合、 ONLY(table-name ) は table-name を指定することと同じになります。 ONLY に指定した view-name に副視点がない場合、 ONLY(view-name ) は view-name を指定することと同じになります。
OUTER(table-name ) または OUTER(view-name )を指定した場合、 それは仮想表を表します。 OUTER に指定した table-name または view-name に副表または副視点がない場合は、 OUTER を指定してもしなくても同じです。 OUTER(table-name ) は、次のように table-name から派生します。
上記の点は OUTER(view-name ) にも当てはまります。 その場合、table-name を view-name に、 副表を副視点に読み替えてください。
ONLY または OUTER を使用するときには、 table-name の副表または view-name の副視点ごとに、 SELECT 権限が必要です。
表参照として指定された各 function-name (関数名) およびその引き数のタイプは、 アプリケーション・サーバーの既存の表関数に解決されなければなりません。
括弧内の全選択 (fullselect) とその後に続く相関名 (correlation name) は、 ネストされた表式 と呼ばれます。
joined-table (結合表) は、 1 つまたは複数の結合演算の結果である中間結果セットを指定します。 詳細については、結合表を参照してください。
すべての表参照の直接的な名前は固有でなければなりません。 直接的な名前とは、以下の名前です。
各 correlation-name (相関名) は、直前の 表名、視点名、 ニックネーム、 関数名 の参照またはネストした表式の指定子として定義されます。 表、視点、表関数、またはネストした表式の列に対する修飾参照では、 必ず直接的な名前を使用しなければなりません。 同じ表名、視点名、またはニックネームを 2 回指定する場合は、 その少なくとも 1 回の指定の後には相関名 を付ける必要があります。 相関名 は、表、視点、 またはニックネームの列に対する参照を修飾するのに使用されます。 相関名 が指定されている場合、表名、視点名、 ニックネーム、関数名 の参照、 あるいはネストした表式の列に名前を指定するために、 列名 を指定することもできます。 詳しくは、相関名を参照してください。
通常、表関数、およびネストされた表の式は、FROM 文節にのみ指定することができます。 表関数およびネストされた表の式からの列は、選択リストの中および残りの副選択で、 指定する必要のある相関名を使用して参照することができます。 この相関名の効力範囲は、FROM 文節の他の表名、視点名、 またはニックネームの相関名と同じです。 ネストされた表式は、次の場合に使用することができます。
一般的に、表関数とその引き数値は、 表や視点とまったく同じ方法で SELECT の FROM 文節で参照することができます。 ただし、特殊な考慮事項が適用されます。
相関名 の後に代替列名を指定する場合を除いて、表関数の列名は、 CREATE FUNCTION ステートメントの RETURNS 文節に指定された列名になります。 これは、CREATE TABLE ステートメントに定義されている表の列名に類似したものです。 表関数作成の詳細については、 CREATE FUNCTION (外部表)または CREATE FUNCTION (SQL スカラー、表、または行)を参照してください。
表関数参照に指定された引き数は関数名と共に、 関数解決 と呼ばれるアルゴリズムによって、 使用する正確な関数を判別するのに用いられます。 これは、ステートメントで使用される他の関数 (たとえば、 スカラー関数) の場合に行われるのと同じです。 関数解決は、関数解決 で説明されています。
スカラー関数の引き数の場合と同じように、通常、表関数の引き数は有効な SQL 式です。 したがって、次の例は正しい構文です。
例 1: SELECT c1 FROM TABLE( tf1('Zachary') ) AS z WHERE c2 = 'FLORIDA'; 例 2: SELECT c1 FROM TABLE( tf2 (:hostvar1, CURRENT DATE) ) AS z; 例 3: SELECT c1 FROM t WHERE c2 IN (SELECT c3 FROM TABLE( tf5(t.c4) ) AS z -- correlated reference ) -- to previous FROM clause
相関参照は、ネストされた表の式や、表関数の引き数として使用することができます。 両方の場合に適用される基本的な規則は、相関参照は、 副照会の階層のより高いレベルにある表参照 から行う必要があるということです。 この階層には、FROM 文節の左から右への処理により、 すでに解決されている表参照が含まれています。 ネストされた表の式の場合、TABLE キーワードが全選択の前に指定されなければなりません。 したがって、次の例は正しい構文です。
例 1: SELECT t.c1, z.c5 FROM t, TABLE( tf3(t.c2) ) AS z -- t precedes tf3 in FROM WHERE t.c3 = z.c4; -- so t.c2 is known 例 2: SELECT t.c1, z.c5 FROM t, TABLE( tf4(2 * t.c2) ) AS z -- t precedes tf3 in FROM WHERE t.c3 = z.c4; -- so t.c2 is known 例 3: SELECT d.deptno, d.deptname, empinfo.avgsal, empinfo.empcount FROM department d, TABLE (SELECT AVG(e.salary) AS avgsal, COUNT(*) AS empcount FROM employee e -- department precedes and WHERE e.workdept=d.deptno -- TABLE is specified ) AS empinfo; -- so d.deptno is known
しかし、以下は正しくない例です。
例 4: SELECT t.c1, z.c5 FROM TABLE( tf6(t.c2) ) AS z, t -- cannot resolve t in t.c2! WHERE t.c3 = z.c4; -- compare to Example 1 above. 例 5: SELECT a.c1, b.c5 FROM TABLE( tf7a(b.c2) ) AS a, TABLE( tf7b(a.c6) ) AS b WHERE a.c3 = b.c4; -- cannot resolve b in b.c2! 例 6: SELECT d.deptno, d.deptname, empinfo.avgsal, empinfo.empcount FROM department d, (SELECT AVG(e.salary) AS avgsal, COUNT(*) AS empcount FROM employee e -- department precedes but WHERE e.workdept=d.deptno -- TABLE is not specified ) AS empinfo; -- so d.deptno is unknown