ジョインされている 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 ); |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |