SQL 解説書

あいまいさを避けるための列名修飾子

関数、GROUP BY 文節、ORDER BY 文節、式、または探索条件の文脈では、 列名は、何らかの表、視点、ニックネーム、 ネストされた表の式あるいは表関数の列の値を指します。 列を含む可能性のある表、視点、ニックネーム、 ネストされた表の式および表関数は、 その文脈のオブジェクト表 と呼ばれます。

複数の表に同じ名前の列が含まれている場合があります。 列名を修飾する理由の 1 つは、列がどの表のものかを指定することです。 列名の修飾子は、SQL プロシージャーにおいて、 列名と SQL ステートメントで使われる SQL 変数名を区別するときにも役立ちます。

ネストされた表の式または表関数は、 FROM 文節で先行する table-references をオブジェクト表と見なします。 後続の table-references はオブジェクト表とは見なされません。

表指定子

特定のオブジェクト表を指定する修飾子は、表指定子 と呼ばれます。

オブジェクト表を指定する文節では、そのオブジェクト表に対する表指定子も設定します。 以下の例は、SELECT 文節の式のオブジェクト表を、直後の FROM 文節で指定しています。

  SELECT CORZ.COLA, OWNY.MYTABLE.COLA
    FROM OWNX.MYTABLE CORZ, OWNY.MYTABLE

FROM 文節の表指定子は次のように設定されます。

列へのあいまいな参照が生じる可能性を避けるため、 各表指定子は、特定の FROM 文節の中では固有でなければなりません。

未定義またはあいまいな参照の回避

列名が列の値を参照する場合、 その名前はただ 1 つのオブジェクト表の中に含まれているものでなければなりません。 以下の状態はエラーとみなされます。

固有に定義された表指定子で列名を修飾することによって、 あいまいな参照を避けてください。 列が名前の異なる複数のオブジェクト表の中に含まれている場合、 その表名を指定子として使用することができます。 また、相関名の後に続いて列名のリストを使用してオブジェクト表のいずれかの列に固有名を指定することによって、 表指定子を使用しなくてもあいまいな参照を避けることができます。

列を直接的な表名形式の表指定子で修飾するとき、 直接的な表名は修飾の付いた形式でも付かない形式でも使用できます。 しかし、表名、視点名、またはニックネームと、表指定子を完全に修飾した後は、 使用される修飾子と表が同じものでなければなりません。

  1. たとえば、ステートメントの許可 ID が CORPDATA とすると、 以下のステートメントは有効です。
      SELECT CORPDATA.EMPLOYEE.WORKDEPT
        FROM EMPLOYEE
    

    は有効なステートメントです。

  2. ステートメントの許可 ID が REGION の場合、以下は無効です。
      SELECT CORPDATA.EMPLOYEE.WORKDEPT
        FROM EMPLOYEE                           * incorrect *
    

    これは、EMPLOYEE が表 REGION.EMPLOYEE を表しているのに対し、 WORKDEPT の修飾子が別の表 CORPDATA.EMPLOYEE を表しているためです。


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