SQL 解説書

相関参照における列名修飾子

全選択 とは、 種々の SQL ステートメントの構成要素として使用される照会の 1 つの形式です。 全選択については、照会を参照してください。 任意のステートメントの探索条件で使用される全選択は、 副照会 と呼ばれます。

ステートメントで式として単一値を検索するのに使用される全選択は、 スカラー全選択 またはスカラー副照会 と呼ばれます。

照会の FROM 文節で使用される全選択は、 ネストされた表の式 と呼びます。

探索条件、スカラー副照会、およびネストされた表の式の副照会を、 このトピックのこれ以降の部分では副照会と呼びます。

副照会にはそれ自身の副照会を含めることができます。 その副照会の中に、また副照会が含まれていてもかまいません。 したがって、SQL ステートメントに副照会の階層が含まれることになる場合があります。 副照会を含む階層の要素は、それに含まれている副照会よりも高いレベルとされます。

階層のあらゆる要素には、1 つ以上の表指定子が含まれています。 副照会は、階層中の自分のレベルで指定されている表の列だけでなく、 階層中のそれより前のレベルで指定されている表の列から階層の最上位で識別される表の列まで参照できます。 上位のレベルで指定される表の列への参照は、相関参照 と呼ばれます。

既存の SQL 標準規格との互換性のため、 修飾子付きと修飾子なしのどちらの列名も相関参照として認められています。 ただし、副照会で使用されるすべての列参照を修飾することをお奨めします。 そうしないと、同一の列名により予期しない結果が生じることがあります。 たとえば、ある階層の表が相関参照として同じ列名を含むように変更され、 ステートメントが再度作成処理された場合、 新たな参照は変更された表に対して適用されます。

副照会に含まれる列名が修飾されているときは、 修飾されているその列名が出現するのと同じ副照会から探索が始まり、 修飾子に一致する表指定子が見つかるまで、 階層の上位へ向かって階層の各レベルの探索が続けられます。 該当するものが見つかると、その表に指定の列があるかどうかが調べられます。 列名の含まれているレベルより高いレベルで表が見つかった場合、 これは表指定子が見つかったレベルに対する相関参照となります。 ネストされた表の式の全選択より上の階層を探索するためには、 ネストされた表の式の前にオプションの TABLE キーワードを指定しなければなりません。

副照会に含まれる列名が修飾されていないときは、 その列名が出現するのと同じ副照会から始めて、 階層の各レベルで参照されている表が探索され、 一致する列名が見つかるまで、階層の上位へ向かって探索が続けられます。 列名を含むレベルより高いレベルの表で列が見つかった場合は、 その列を含む表が見つかったレベルに対する相関参照となります。 列名が、特定のレベルの 2 つ以上の表で見つかった場合は、 参照はあいまいになり、エラーとみなされます。

以下の例の T は、どの場合も、列 C を含む表指定子を参照しています。 列名 T.C は、以下の条件がすべて満たされているときにのみ相関参照となります (この T は暗黙の修飾子か明示的な修飾子のいずれかを表します)。

同じ表、視点、またはニックネームが、 多くのレベルで指定されていることがあるため、 表指定子としては固有の相関名を使用するようお勧めします。 T が 2 つ以上のレベルで表の指定に使用される場合 (T は表名自体か重複の相関名)、 T.C は、T.C を含む副照会を最も直接的に含むように T が使用されているレベルを参照することになります。 上位レベルへの相関が必要な場合、固有な相関名を使用する必要があります。

相関参照 T.C は、2 つの探索条件が、探索条件 1 が副照会で、 探索条件 2 が上位のレベルでそれぞれ適用されている T の行またはグループでの C の値を識別します。 条件 2 が WHERE 文節で使用される場合、副照会は条件 2 が適用される行ごとに評価されます。 条件 2 が HAVING 文節で使用される場合、副照会は条件 2 が適用されるグループごとに評価されます。 (副照会の評価については、照会の WHERE 文節と HAVING 文節の部分を参照。)

たとえば、次のステートメントにおいて、(最後の行の) 相関参照 X.WORKDEPT は、 最初の FROM 文節のレベルにある表 EMPLOYEE の WORKDEPT の値を指します。 (この文節は X を EMPLOYEE の相関名として設定します。) このステートメントは、その部署の平均給与を下回る社員のリストを作成するものです。

   SELECT EMPNO, LASTNAME, WORKDEPT
     FROM EMPLOYEE X
     WHERE SALARY < (SELECT AVG(SALARY)
                       FROM EMPLOYEE
                       WHERE WORKDEPT = X.WORKDEPT)

次の例は、THIS を相関名として使用しています。 このステートメントは、社員のいない部門の行を削除します。

   DELETE FROM DEPARTMENT THIS
      WHERE NOT EXISTS(SELECT *
                         FROM EMPLOYEE
                         WHERE WORKDEPT = THIS.DEPTNO)


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]