未定義またはあいまいな参照の回避
列名によって列の値を参照する場合は、その列名が、必ず 1 つのオブジェクト・テーブルで解決できなければなりません。
次のような場合は、エラーと見なされます。
- 指定した名前を持つ列が入っているオブジェクト・テーブルが存在しない。この参照は未定義になります。
- 列名が表指定子によって修飾されているときに、指定した名前を持つ列が、指定した表に存在しない。この参照も未定義になります。
- 列名が修飾されていないときに、その名前を持つ列が、複数のオブジェクト・テーブルに存在する。 この参照はあいまいになります。
- 列名が表指定子によって修飾されているときに、 指定した表が FROM 文節内で固有ではなく、指定した表が出現する 2 回とも、表に列が含まれている。 この参照はあいまいになります。
- 列名がネストされた表の式にあり、この表式が LATERAL または TABLE キーワードの後にはないか、 列名がある表関数またはネストされた表の式が右外部結合、全外部結合 または右例外結合の右オペランドではなく、列名がネストされた表式の全選択内の表参照 の列を参照していない。 この参照は未定義になります。
あいまいな参照を避けるには、固有のものとして定義されている表指定子によって列名を修飾します。 同じ名前の列が、異なる名前を持ついくつかのオブジェクト・テーブルに入っている場合は、オブジェクト・テーブルの名前を表指定子として使うことができます。 相関名に続けて列名リストを使用して、1 つのオブジェクト・テーブルの列に固有の名前を付けることにより、 表指定子を使用しなくても、あいまいな参照を避けることができます。
直接的な表名による表指定子で列を修飾する場合は、直接的な表名の修飾形式と非修飾形式のいずれかを使用します。ただし、使用する修飾子および表は、表名またはビュー名と表指定子を完全に修飾したものと同じでなければなりません。
- デフォルトのスキーマが CORPDATA である場合は、次のようになります。
このステートメントは、有効なステートメントです。SELECT CORPDATA.EMPLOYEE.WORKDEPT FROM EMPLOYEE - デフォルトのスキーマが REGION である場合は、次のようになります。
このステートメントは無効です。EMPLOYEE は REGION.EMPLOYEE という表を表していますが、WORKDEPT の修飾子は、CORPDATA.EMPLOYEE という異なる表を表しているからです。SELECT CORPDATA.EMPLOYEE.WORKDEPT FROM EMPLOYEE ***INCORRECT*** - デフォルトのスキーマが REGION である場合は、次のようになります。
このステートメントは無効です。 選択リスト内の EMPLOYEE は REGION.EMPLOYEE という表を表していますが、 FROM 文節で明示的に修飾されている表名は、CORPDATA.EMPLOYEE という異なる表を表しているからです。 この場合、選択リストからその表修飾子を省略するか、 または FROM 文節内の表指定子に相関名を定義して、 その相関名をステートメント内で列名の指定子を使用します。SELECT EMPLOYEE.WORKDEPT FROM CORPDATA.EMPLOYEE ***INCORRECT***