Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL の使用法 » データのクエリと変更 » ジョイン:複数テーブルからのデータ検索 » キー・ジョイン » テーブル式のキー・ジョイン

 

カンマを含まないテーブル式のキー・ジョイン

ジョインされている 2 つのテーブル式のどちらにもカンマが含まれていない場合、SQL Anywhere は文中にあるテーブルのペアの外部キー関係を調べ、ジョイン条件を 1 つだけ生成します。

たとえば、次のジョインには A-C と B-C という 2 つのテーブル・ペアがあります。

(A NATURAL JOIN B) KEY JOIN C

C と (A NATURAL JOIN B) をジョインするために、SQL Anywhere はテーブル・ペア A-C と B-C の外部キー関係を調べて、ジョイン条件を 1 つだけ生成します。複数の外部キー関係が存在する場合は、次のキー・ジョイン決定規則に基づき、この 2 つのペアに対して 1 つのジョイン条件を生成します。

  • まず、参照先となるプライマリ・キー・テーブルのうち、その 1 つの相関名と同じ役割名を持つ単一の外部キーを指定するために A-C および B-C の両方が調べられる。この基準に合う外部キーが 1 つだけ存在する場合には、それが使用される。テーブルの相関名と同じ役割名の外部キーが 2 つ以上ある場合、そのジョインはあいまいと見なされてエラーが発行される。

  • テーブルの相関名と同じ名前の外部キーがない場合は、そのテーブルの外部キー関係が検索される。見つかった外部キー関係が 1 つであれば、それが使用される。2 つ以上見つかると、そのジョインはあいまいと見なされてエラーが発行される。

  • 外部キー関係がまったく存在しない場合は、エラーが発行される。

詳細については、複数の外部キー関係がある場合のキー・ジョインを参照してください。

次の例は、営業部員とその部署をすべて検索するクエリです。

SELECT Employees.Surname, 
        FK_DepartmentID_DepartmentID.DepartmentName
FROM ( Employees KEY JOIN Departments 
        AS FK_DepartmentID_DepartmentID )
    KEY JOIN SalesOrders;

このクエリは次のように解釈できます。

  • SQL Anywhere はテーブル式 ( Employees KEY JOIN Departments as FK_DepartmentID_DepartmentID ) を調べ、外部キー FK_DepartmentID_DepartmentID に基づいて、ジョイン条件 Employees.DepartmentID = FK_DepartmentID_DepartmentID.DepartmentID を生成する。

  • 次に Employees/SalesOrders と Departments/SalesOrders のテーブル・ペアを調べる。テーブル SalesOrders と Employees 間、および、テーブル SalesOrders と Departments 間に存在できる外部キーは 1 つだけである。それ以外の場合は、ジョインはあいまいになる。この場合、テーブル SalesOrders と Employees 間には外部キー関係が 1 つだけ存在し (FK_SalesRepresentative_EmployeeID)、テーブル SalesOrders と Departments 間に外部キーは存在しない。したがって、ジョイン条件 SalesOrders.EmployeeID = Employees.SalesRepresentative が生成される。

したがって、次のクエリは上のクエリと同義です。

SELECT Employees.Surname, Departments.DepartmentName
FROM ( Employees JOIN Departments
    ON ( Employees.DepartmentID = Departments.DepartmentID ) )
JOIN SalesOrders
    ON ( Employees.EmployeeID = SalesOrders.SalesRepresentative );