2 つのテーブル式リストのキー・ジョインに対してジョイン条件を生成する場合、SQL Anywhere は文中のテーブルのペアを調べて、各ペアに対してジョイン条件を生成します。最後のジョイン条件は各ペアのジョイン条件の論理積です。各ペア間には外部キー関係が存在する必要があります。
次の例では、2 つのテーブル・ペア A-C と B-C をジョインします。
SELECT * FROM ( A,B ) KEY JOIN C; |
SQL Anywhere では、2 つのテーブル・ペア A-C と B-C のそれぞれに対してジョイン条件を生成することで、C と (A,B)
をジョインするためのジョイン条件が生成されます。このように複数の外部キー関係が存在する場合は、次のキー・ジョイン規則に従って処理されます。
各ペアに対して、プライマリ・キー・テーブルの相関名と同じ名前の役割名を持つ外部キーが検索される。この基準に合う外部キーが 1 つだけ存在する場合には、それが使用される。2 つ以上見つかると、そのジョインはあいまいと見なされてエラーが発行される。
各ペアに、テーブルの相関名と同じ名前の外部キーがない場合は、そのテーブル間の外部キー関係が検索される。見つかった外部キー関係が 1 つであれば、それが使用される。2 つ以上見つかると、そのジョインはあいまいと見なされてエラーが発行される。
各ペアに、外部キー関係がまったく存在しない場合は、エラーが発行される。
各ペアにジョイン条件を 1 つだけ決定できる場合は、AND によってジョイン条件が組み合わされる。
複数の外部キー関係がある場合のキー・ジョインも参照してください。
次は、ある地域で 1 つ以上の注文を受けたすべての営業部員の名前を返すクエリです。
SELECT DISTINCT Employees.Surname, FK_DepartmentID_DepartmentID.DepartmentName, SalesOrders.Region FROM ( SalesOrders, Departments AS FK_DepartmentID_DepartmentID ) KEY JOIN Employees; |
Surname | DepartmentName | Region |
---|---|---|
Chin | Sales | Eastern |
Chin | Sales | Western |
Chin | Sales | Central |
... | ... | ... |
このクエリでは、テーブルの 2 つのペア、SalesOrders と Employees、および Departments AS FK_DepartmentID_DepartmentID と Employees を扱います。
SalesOrders と Employees のペアには、一方のテーブルと同じ役割名の外部キーはありません。ただし、2 つのテーブルに関連した外部キー (FK_SalesRepresentative_EmployeeID) が 1 つあります。これは、2
つのテーブルに関連する唯一の外部キーであり、この外部キーが使用されて、生成されたジョイン条件 ( Employees.EmployeeID = SalesOrders.SalesRepresentative )
になります。
Departments AS FK_DepartmentID_DepartmentID と Employees のペアでは、プライマリ・キー・テーブルと同じ役割名を持つ外部キーは 1 つです。そのキーは FK_DepartmentID_DepartmentID
で、クエリ内の Departments テーブルに指定した相関名と一致します。プライマリ・キー・テーブルの相関名と同じ名前の外部キーは他にないため、このテーブル・ペアのジョイン条件は FK_DepartmentID_DepartmentID を使用して作成されます。生成されるジョイン条件は
(Employees.DepartmentID = FK_DepartmentID_DepartmentID.DepartmentID)
です。2 つのテーブルに関連する外部キーはもう 1 つありますが、この外部キーの名前はどちらのテーブルの名前とも異なるため、要因にはなりません。
最後のジョイン条件は、それぞれのテーブル・ペアに対して生成されたジョイン条件を 1 つにまとめます。したがって、次のクエリは同義です。
SELECT DISTINCT Employees.Surname, Departments.DepartmentName, SalesOrders.Region FROM ( SalesOrders, Departments ) JOIN Employees ON Employees.EmployeeID = SalesOrders.SalesRepresentative AND Employees.DepartmentID = Departments.DepartmentID; |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |